1. ホーム
  2. database

[解決済み] リレーショナルテーブルの命名規則【終了しました

2022-04-20 04:49:01

質問

新しいプロジェクトを始めるので、テーブル名とカラム名を最初から正しく付けたいのですが、どうすればいいですか?例えば、テーブル名にはいつも複数形を使っていましたが、最近、単数形が正しいことを知りました。

つまり、テーブル "user"を用意して、そのユーザーだけが持つ商品を用意したとします。 テーブルの名前は "user_product" か、単に "product" か、どちらを選ぶべきですか?これは1対多の関係です。

さらに、(何らかの理由で)各商品に複数の商品説明がある場合、"user_product_description" か "product_description" か、単に "description" か?もちろん、適切な外部キーが設定されていればですが...。説明だけというのは、ユーザーの説明やアカウントの説明などもあり得るので、問題でしょう。

もし、純粋なリレーショナルテーブル(多対多)を2列だけにしたい場合はどうでしょうか。また、最初のものであれば、例えば "user_product" とどのように区別するのでしょうか?

また、何かお勧めの命名規則があれば、遠慮なくリンクを貼ってください。

ありがとうございます。

解決方法は?

テーブル - 名前

recently learned singular is correct

はい、異教徒に気をつけましょう。 複数 テーブル名で は、標準的な資料を一切読んでおらず、データベース理論の知識もない人であることは確実です。

スタンダードの素晴らしいところとしては

  • すべて互いに統合されている
  • 一緒に働く
  • 私たちよりも優れた頭脳によって書かれたものなので、私たちが議論する必要はないのです。 を議論する。

標準のテーブル名では、各 は、テーブルの全内容ではなく、すべての文言で使用されます (私たちは、テーブルの Customer テーブルには、すべての顧客が含まれています)。

関係, 動詞句

モデル化された本物のリレーショナル・データベースでは(1970年以前のレコード・ファイリング・システムとは対照的に Record IDs 便宜上SQLデータベースコンテナで実装されたもの)。

  • は、テーブルが 件名 であるため、データベースの 名詞 また、単数
  • テーブル間の関係は アクション というように、名詞と名詞の間で行われるもので、これらは 動詞 (すなわち、それらは任意の番号や名前ではありません)
  • その その 述語
  • データモデルから直接読み取ることができるものすべて (末尾の私の例を参照してください)
  • (独立テーブル(階層構造の最上位の親)の述語は、それが独立していることです。)
  • したがって 動詞句 は、最も意味のあるものを慎重に選び、一般的な用語は避ける(これは経験を積めば容易になる)。 動詞句はモデリング中に重要である。なぜなら、動詞句はモデルの解決、すなわち関係の明確化、エラーの特定、テーブル名の修正に役立つからである。
[**Diagram_A**][Diagram_A]

もちろん、このリレーションシップはSQLで実装された CONSTRAINT FOREIGN KEY を子テーブルの中に入れてください(詳しくは後述します)。 以下は 動詞のフレーズ (モデル内)であるのに対し 述語 を表し(モデルから読み込まれる)、FK 制約条件名 :

    Initiates
    Each Customer Initiates 0-to-n SalesOrders
    Customer_Initiates_SalesOrder_fk

表 - 言語

しかし を記述する場合 特に述語などの専門用語やその他の文書では、英語と同じように単数形と複数形を使用します。 テーブルの名前は1つの行(関係)に対して付けられており、言語では派生した各行(派生関係)を参照することを念頭に置いてください。

    Each Customer initiates zero-to-many SalesOrders

ではなく

    Customers have zero-to-many SalesOrders 

では、テーブル "user"があり、ユーザーだけが持つ商品がある場合、テーブルの名前は "user-product"にすべきでしょうか、それとも単に "product"にすべきでしょうか。これは1対多の関係です。

(これは命名規約の問題ではなく、DB設計の問題です)。 user::product は1::nです。 重要なのは product が独立したエンティティであるかどうか、そして 独立したテーブル つまり、それ自体で存在することができます。 したがって product ではなく user_product .

そして、もし product のコンテキストにのみ存在します。 user つまり、それは 従属テーブル したがって user_product .

[**Diagram_B**][Diagram_B]

さらに、(何らかの理由で)各商品に複数の商品説明がある場合、それは "user-product-description" か "product-description" か、それとも単なる "description" になるのだろうか?もちろん、適切な外部キーが設定されていればですが...。もちろん、適切な外部キーが設定されていればですが。

その通りです。 どちらかというと user_product_description xor product_description は、上記を踏まえて、正しくなります。 他の xxxx_descriptions しかし、これはその名前がどこに属するかを示すものであり、接頭辞は親テーブルを意味します。

<ブロッククオート

もし、純粋なリレーショナルテーブル(多対多)を2列だけにしたい場合、これはどうなるのでしょうか?また、最初のものであれば、例えば "user-product" と何を区別するのでしょうか?

  1. リレーショナル・データベースのすべてのテーブルが、純粋なリレーショナル・テーブル、正規化されたテーブルであることを願っています。 名前にそのことを明記する必要はありません(さもなければ、すべてのテーブルが rel_something ).

  2. が含まれている場合 のみ を解決する)。 論理的 n::n の関係は、論理レベルでは実体として存在しない。 物理的 テーブル)であり、それは アソシアティブテーブル . はい、通常、名前は2つの親テーブルの名前の組み合わせになります。

    • このような場合、動詞句は親から親に適用され、子テーブルを無視して読まれることに留意してください。

      [**Diagram_C**][Diagram_C]
    • もし、それが ない 連想表 (つまり、2 つの PK に加えてデータを含む) の場合は、適切な名前を付け、動詞句は関係の末端にある親ではなく、そのテーブルに適用されます。

      [**Diagram_D**][Diagram_D]
  3. が2つになってしまった場合 user_product テーブルを作成した場合、それはデータを正規化していないという非常に大きなシグナルになります。 そこで、数ステップ戻って、テーブルの名前を正確かつ一貫したものにする必要があります。 そうすれば、名前は自然に解決されます。

命名規則

また、何かお勧めの命名規則があれば、遠慮なくリンクを貼ってください。

何をやっているかはとても重要で、あらゆるレベルでの使い勝手や理解度に影響します。 ですから、最初にできるだけ多くの理解を深めておくとよいでしょう。 SQLのコーディングを始めるまでは、この中のほとんどのことの関連性は明らかではありません。

  1. ケース が最初の対応項目です。 オールキャピタルは許されない。 特にユーザーが直接アクセスできるテーブルであれば、大文字と小文字の混在は普通です。 私のデータモデルを参照してください。 なお、小文字しか使えないような頭の悪いNonSQLを使用している場合は、アンダースコアを入れています(あなたの例と同じ)。

  2. を維持する。 データフォーカス アプリケーションや使い方にフォーカスするのではなく それは、結局のところ2011年、私たちは オープンアーキテクチャ データベースは、それを使用するアプリケーションから独立しているはずです。

そうすれば、成長し、複数のアプリが使用するようになっても、命名に意味があり、訂正の必要がありません。(一つのアプリに完全に組み込まれたデータベースはデータベースではありません。) データ要素にはデータとしてのみ名前をつけてください。

  1. テーブルやカラムの名前には十分配慮してください。 正確に . を使用しないでください。 UpdatedDate である場合、それが DATETIME のデータ型を使用します。 UpdatedDtm . を使用しないでください。 _description が含まれている場合、投与量を指定します。

  2. であることが重要です。 一貫性 データベース全体で を使用しないでください。 NumProduct というように、商品数を示すために一カ所で ItemNo または ItemNum を別の場所に配置し、アイテムの数を示す。 使用方法 NumSomething は数-of を、そして SomethingNo または SomethingId は、一貫して識別子用です。

  3. のように、カラム名の前にテーブル名やショートコードを付けないでください。 user_first_name . SQLではすでにタブ名を修飾子として提供しています。

         table_name.column_name  -- notice the dot
    
    
  4. 例外あり。

    • 最初の例外はPKで、これは特別な扱いが必要です。なぜなら、PKは常に結合でコーディングされ、キーをデータカラムから目立たせたいからです。 常に user_id 決して id .

      • なお、これは ではない は、プレフィックスとして使われるテーブル名ではなく、キーの構成要素に対する適切な説明的名前です。 user_id はユーザーを識別するカラムであって iduser テーブルを作成します。
        • (もちろん、ファイルがサロゲートでアクセスされ、リレーショナルキーが存在しないレコードファイリングシステムでは別ですが、そこではこれらは1つであり、同じものです)。
      • PKがFKとして運ばれる(移行される)場所では、常にキーカラムに全く同じ名前を使用すること。
      • そのため user_product テーブルには user_id の構成要素として、PK (user_id, product_no) .
      • これの妥当性は、コーディングを始めるとよくわかるようになります。 まず id を多くのテーブルで使用すると、SQLのコーディングで混乱しがちです。 第二に、最初にコーディングした人以外には、何をしようとしていたのかがわからない。 どちらも、キーカラムが上記のように扱われていれば、簡単に防ぐことができる。
    • 2つ目の例外は、同じ親テーブルの表を参照するFKが、子で2つ以上担われている場合です。 のように リレーショナルモデル を使用します。 役割名 のように、意味や使い方を区別するために使用します。 AssemblyCodeComponentCode を2つ PartCodes . そしてその場合、次のようにします。 ではなく を使用し、未分化の PartCode をどちらか一方に使用する。 正確を期してください。

      ダイアグラム_E

  5. プリフィクス

    100以上のテーブルがある場合、テーブル名の前にSubject Areaを付けます。

    REF_ 参考文献の場合

    OE_ オーダーエントリクラスタ用など

    物理レベルのみで、論理レベルではありません(モデルがごちゃごちゃになります)。

  6. サフィックス

    テーブルにはサフィックスを使用せず、それ以外のものには常にサフィックスを使用します。 つまり、論理的な通常のデータベース利用ではアンダースコアを使用せず、管理側ではアンダースコアをセパレータとして使用します。

    _V ビュー(メイン TableName もちろん)

    _fk 外部キー(列名ではなく、制約名)

    _cac キャッシュ

    _seg セグメント

    _tr トランザクション(ストアドプロックまたは関数)

    _fn 関数(非トランザクション型) など

書式は、テーブル名またはFK名、アンダースコア、アクション名、アンダースコア、最後にサフィックスです。

これは本当に重要なことで、サーバーがエラーメッセージを出したとき。

____ blah blah blah error on object_name

どのオブジェクトが侵害されたのか、何をしようとしていたのか、正確に知ることができるのです。

____ blah blah blah error on Customer_Add_tr

  1. 外部キー (列ではなく制約)。 FKの最適な命名は、動詞句("each"とcardinalityを除いたもの)を使用することです。

    Customer_Initiates_SalesOrder_fk

    Part_Comprises_Component_fk

    Part_IsConsumedIn_Assembly_fk

を使用します。 Parent_Child_fk シーケンスではなく Child_Parent_fk は、(a)探すときに正しいソート順で表示される、(b)関係する子は常に分かっているが、推測しているのはどの親か、ということだからです。 エラーメッセージが表示されるのは、嬉しいことです。

____ Foreign key violation on Vendor_Offers_PartVendor_fk .

この方法は、動詞句が特定されているデータをわざわざモデル化する人には効果的です。 それ以外の、レコード・ファイリング・システムなどでは、次のようにします。 Parent_Child_fk .

  1. インデックスは特別なので、独自の命名規則があり、以下のように構成されています。 順番に 1から3までの各文字の位置。

U 一意であること、または _ 一意でない場合

C クラスター化、または _ クラスタ化されていない場合

_ セパレータ

残りの部分について

- キーが1列またはごく少数の列である場合。

____ ColumnNames

- If the key is more than a few columns:  

____ PK 主キー (モデルによる)

____ AK[*n*] 代替キー (IDEF1X用語)

なお、テーブル名は ではなく として常に表示されるため、インデックス名には必須です。 table_name.index_name.

だから、いつ Customer.UC_CustomerId または Product.U__AK がエラーメッセージに表示されるのは、何か意味があることを教えてくれているのです。 テーブルのインデックスを見れば、簡単に区別がつく。

  1. 資格のあるプロフェッショナルな人を見つけて、その人について行く。 彼らのデザインを見て、彼らが使っている命名規則を注意深く研究してください。 わからないことは具体的に質問してください。 逆に、命名規則や標準をほとんど無視するような人からは、死に物狂いで逃げましょう。 以下はその例です。
  • 上記すべての実例が含まれています。 ネーミングに関する質問はこのスレッドでお願いします。
  • もちろん、モデルにはいくつかの その他 命名規則以外の標準については、今のところ無視してもかまいませんし、特定の 新しい質問 .
  • Stack Overflowのインライン画像サポートは鳥のためのもので、ブラウザによって読み込みが安定しないので、リンクをクリックする必要があります。
  • PDFファイルにはフルナビゲーションがあるので、青いガラスのボタンや、展開が確認できるオブジェクトをクリックしてください。
  • リレーショナル・モデリング・スタンダードに馴染みのない読者には IDEF1X記法 を参考にしてください。

オーダーエントリー&インベントリー 標準規格に準拠したアドレスで

シンプルなオフィス間 会報誌 PHP/MyNonSQLのためのシステム

センサーモニタリング 完全な時間軸を持つ

質問に対する回答

コメント欄では合理的に答えられないこと。

ラリー・ラスティグ

...最も些細な例でさえも示している...

顧客が0対多の製品を持ち、製品が1対多のコンポーネントを持ち、コンポーネントが1対多のサプライヤを持ち、サプライヤが0対多のコンポーネントを販売し、セールスレップが1対多の顧客を持つ場合、顧客、製品、コンポーネント、サプライヤを保持するテーブル名はquot;natural"です?

このコメントには、2つの大きな問題があります。

  1. あなたは自分の例を「最も些細なもの」と断言していますが、そうではありません。 このような矛盾があると、技術的な能力はともかくとして、あなたが本気なのかどうか、私にはわかりません。

  2. そのquot;trivial"な推測には、重大な正規化(DB設計)エラーがいくつかあります。

  • それらを修正するまでは、不自然で異常なものであり、何の意味もない。 abnormal_1、abnormal_2などと命名した方がよいでしょう。

  • 何も供給していないquot;suppliers"、循環参照(違法、不要)、購入の根拠となる商取引(InvoiceやSalesOrderなど)なしに製品を購入する顧客(または顧客が製品を所有しているか)、解決されていない多対多関係、などです。

  • これが正規化され、必要なテーブルが特定されれば、その名称は自ずと明らかになる。 当然です。

いずれにせよ、私はあなたの問い合わせに対応するよう努力するつもりです。 ということは、あなたが何を言いたいのかわからないまま、私が何らかの意味を付け加えなければならない、ということです。 また、誤字脱字は枚挙にいとまがなく、仕様の余裕を考えると、すべて修正した自信はありません。

  • 製品が部品で構成されている場合、その製品はアセンブリであり、その部品は複数のアセンブリで使用されると仮定してみます。

  • さらに、サプライヤーは0対多のコンポーネントを販売しているので、サプライヤーは ない 製品またはアセンブリを販売するのではなく、コンポーネントのみを販売する。

投機と正規化モデル

因みに、四角い角(Independent)と丸い角(Dependent)の違いは大きく、IDEF1X Notationのリンクを参照してください。 同様に、実線(識別)対破線(非識別)についても。

<ブロッククオート

... 顧客、製品、部品、サプライヤーを保持するテーブルの名前はどのようなものですか?

  • お客様
  • 製品名
  • コンポーネント (または、AssemblyComponent、1つの事実が他の事実を識別することに気づく人のために)
  • サプライヤー

テーブルを解決した今、私はあなたの問題を理解していません。 おそらく 具体的 という質問をします。

述語

VoteCoffeeです。

Ronnisが投稿した例で、2つのテーブル(user_likes_product, user_bought_product)間に複数のリレーションが存在するシナリオはどのように扱っていますか?私は誤解しているかもしれませんが、この場合、あなたの詳細な規約を使用すると、テーブル名が重複するように思われます。

Normalisationのエラーがないとして。 User likes Product は述語であり、テーブルではありません。 混同しないようにしましょう。 主語、動詞、述語に関連する私の回答、およびすぐ上のラリーへの回答を参照してください。

  • 各テーブルには セット のファクト(各行が1つのファクト)。 述語(または命題)はFactではなく、それらは真であるかどうかわからない。

  • その リレーショナルモデル は、First Order Predicate Calculus (より一般的にはFirst Order Logicとして知られている) に基づいている。述語とは、単純で正確な英語による単一節の文であり、真または偽と評価されるものである。

  • さらに、各テーブルが表す、あるいはその実装である。 多数 述語は1つではなく、2つです。

  • クエリとは、述語(または連鎖した複数の述語)をテストして、真(ファクトが存在する)または偽(ファクトが存在しない)の結果を出すことです。

  • したがって、テーブルは、私の回答(命名規則)で詳しく説明したように、行、Fact、そしてPredicatesを文書化する必要がありますが(ぜひ、データベースの文書の一部です)、Predicatesのリストとしては別個のものにすべきです。

  • これは、それらが重要でないと言っているのではありません。 それらは非常に重要ですが、ここでは書きません。

  • では、早速ですが。 を導入して以来 リレーショナルモデル はFOPCを基盤としているので、データベース全体はFOPC宣言の集合、すなわちPredicatesの集合であると言える。 しかし、(a) Predicateには多くの種類があり、(b) テーブルはひとつのPredicateを表現しているわけではない(それは、物理的な実装として 多数 述語、そして異なる タイプ の述語)。

  • したがって、テーブルが表す述語をquot;the"と名付けるのは、不合理な概念です。

  • 理論家たちは、わずかな述語しか知らないので RM はFOLを基礎としているため、データベース全体が述語の集合であり、その種類もさまざまです。

  • そしてもちろん、数少ない知っているものの中から不条理なものを選ぶのです。 EXISTING_PERSON ; PERSON_IS_CALLED . そんなに悲しいことでなければ、陽気な話です。

  • また、標準またはアトミックなテーブル名(行の名前)は、すべての文言(テーブルに付属するすべての述語を含む)に対して見事に機能することに注意してください。 逆に、バカげた "table represents predicate" という名前は、そうすることができません。 これは、述語についてほとんど理解していない「理論家」にとっては良いことですが、そうでない場合は遅れをとってしまいます。

  • データモデルに関連するPredicatesは、次のように表されます。 には、2つの順序があります。

  1. 単項述語

    最初のセットは ダイアグラム テキストではありません。 表記法そのもの . これには、様々な存在述語、制約指向述語、および記述子(属性)述語が含まれる。
  • もちろん、Standardデータモデルを「読める」人だけが、これらのPredicatesを読むことができるということです。だから、テキスト・オンリーの考え方に縛られている理論家たちは、データモデルを読むことができないし、1984年以前のテキスト・オンリーの考え方に固執しているのです。
  1. 二項述語

    第二のセットは、以下のものを形成するものです。 関係 ファクトの間にある。 これが関係線である。 Verb Phrase (詳細は上記) は述語を特定するものである。 命題 実装されている(クエリでテストできる)。 これ以上明確なものはない。
  • したがって、Standardデータモデルに精通している人にとっては、すべてのPredicates 関連する は、モデルの中で文書化されています。 彼らはPredicatesの個別のリストを必要としない(しかし、データモデルからすべてを「読む」ことができないユーザーは必要とする!)。

  • 以下は データモデル ここに述語を列挙しています。 この例を選んだ理由は 存在述語などの述語と 関係述語が示されており 記載されていない述語は記述子だけだからです。 ここでは、求職者の学習レベルのため、彼をユーザーとして扱っています。

したがって、2つの親テーブルの間に複数の子テーブルが存在しても問題なく、存在事実の内容通りに名前を付けて、名前を正規化すればよい。

ここで、連想テーブルのリレーションシップ名の動詞句について述べたルールが活きてきます。 以下は 述語とテーブル について、言及されたすべてのポイントを網羅し、要約しています。

述語の正しい使い方とその使い方については、以下のサイトをご覧ください(ここでのコメントへの返信とは全く異なる文脈です)。 この回答 までスクロールしてください。 述語 の部分をご覧ください。


チャールズ・バーンズ

シーケンスとは、Oracleスタイルのオブジェクトで、あるルールに従って数字とその次の数字を格納するために純粋に使用されるものを意味します(例:"add 1")。Oracleには自動IDテーブルがないので、私の典型的な使い方は、テーブルのPKに対してユニークなIDを生成することです。INSERT INTO foo(id, somedata) VALUES (foo_s.nextval, "data"...)

OK、これがKeyまたはNextKeyテーブルと呼ばれるものです。 このような名前を付けてください。 SubjectAreasがある場合は、COM_NextKeyを使用して、データベース全体で共通であることを示します。

それはとてもお粗末なキーの生成方法です。 スケーラブルではありませんが、Oracleのパフォーマンスからすると、おそらくちょうどよい方法でしょう。 さらに、あなたのデータベースはサロゲートでいっぱいで、その部分はリレーショナルではないことを示しています。 つまり、パフォーマンスが極端に悪く、整合性に欠けるのです。