リレーショナルテーブルの命名規則


155

私は新しいプロジェクトを始めており、最初からテーブル名と列名を取得したいと考えています。たとえば、私は常にテーブル名に複数を使用してきましたが、最近学んだ単数は正しいです。

したがって、「user」というテーブルを取得して、そのユーザーだけが持つ製品を取得した場合、テーブルの名前を「user_product」または単に「product」にする必要がありますか?これは1対多の関係です。

さらに、(何らかの理由で)各製品について複数の製品の説明がある場合、それは「user_product_description」または「product_description」または単に「説明」でしょうか?もちろん、適切な外部キーが設定されている場合。ユーザーの説明やアカウントの説明などがあるため、説明に名前を付けるだけでも問題があります。

列が2つだけの純粋なリレーショナルテーブル(多対多)が必要な場合はどうなりますか?「user_stuff」または「rel_user_stuff」のようなものですか?そして、最初の場合、たとえば「user_product」とこれをどのように区別しますか?

どんな助けも高く評価されます。皆さんがお勧めする命名規則の標準がある場合は、自由にリンクしてください。

ありがとう


20
(a)質問は4年前に尋ねられ、回答されました。(b)質問と選択された回答の両方が高い票を持っています。(c)命名規則タグがあります(d)初心者が答えるには「意見に基づく」かもしれませんが、それはシーカーが求めている経験豊富な技術者にとっては標準の問題です。それにもかかわらず、多くの処方のそれぞれに理由が与えられています。(e)したがって、証拠のおかげで、primarily opinion-based明らかに誤りです。
PerformanceDBA

経験豊富な技術者、または古代のIDEF標準に出会い、それが実際の標準であると信じる人々にとっては、標準の問題です。
gbr 2017

1
さらに、命名規則には他にもいくつかのQがありますが、すべて値があります。...右の列にリンクされた参照してください
PerformanceDBA

回答:


385

テーブル•名前

最近学んだ単数形は正しい

はい。異教徒に注意してください。表の名前が複数あるのは、標準的な資料をまったく読んでおらず、データベース理論の知識もない人の確かな兆候です。

標準に関するすばらしい点のいくつかは次のとおりです。

  • それらはすべて互いに統合されています
  • 彼らは一緒に働く
  • それらは私たちよりも優れた心によって書かれたので、私たちはそれらについて議論する必要はありません。

標準のテーブル名は、テーブルのすべての内容ではなく、すべての表現で使用されるテーブルの各行を指します(CustomerテーブルにはすべてのCustomersが含まれていることがわかります)。

関係、動詞句

モデル化された本物のリレーショナルデータベース(1970年以前のレコードファイリングシステム(Record IDsこれは、便宜上SQLデータベースコンテナーに実装されることで特徴付けられる)とは対照的)では、次のようになります。

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

ダイアグラム_A

もちろん、リレーションシップはSQLでは子CONSTRAINT FOREIGN KEYテーブルとして実装されます(詳細は後で)。以下は、動詞句(モデル内)、それが表す述語(モデルから読み取られる)、およびFK 制約名です。

    Initiates
    Each Customer Initiates 0-to-n SalesOrders
    Customer_Initiates_SalesOrder_fk

テーブル•言語

ただし、特に述語やその他のドキュメントなどの技術言語で表を説明する場合は、自然に英語で使用される単数形と複数形を使用します。テーブルは単一の行(リレーション)の名前が付けられ、言語は各派生行(派生リレーション)を参照することに注意してください。

    Each Customer initiates zero-to-many SalesOrders

ない

    Customers have zero-to-many SalesOrders 

したがって、「user」というテーブルを取得して、そのユーザーだけが持つ製品を取得した場合、テーブルの名前を「user-product」または単に「product」にする必要がありますか?これは1対多の関係です。

(これは命名規則の問題ではありません。これはdb設計の問題です。)user::product1 :: n かどうかは関係ありません。重要なのはproduct、独立したエンティティであるかどうか、およびそれが独立したテーブルであるかどうかです。それはそれ自体で存在することができます。したがってproduct、ではないuser_product

productのコンテキストでのみ存在する場合user、すなわち。したがって、これは従属テーブルですuser_product

図_B

さらに、(何らかの理由で)各製品についていくつかの製品の説明がある場合、それは「user-product-description」または「product-description」または単に「description」でしょうか?もちろん、正しい外部キーが設定されている場合。ユーザーの説明やアカウントの説明などがあるため、説明に名前を付けるだけでも問題があります。

そのとおり。上記に基づいて、user_product_descriptionxorのどちらかproduct_descriptionが正しくなります。それは他のものと区別することではありませんがxxxx_descriptions、名前にそれがどこに属しているかの感覚を与えることです、接頭辞は親テーブルです。

列が2つだけの純粋なリレーショナルテーブル(多対多)が必要な場合はどうなりますか?「ユーザーのもの」または「rel-user-stuff」のようなものですか?そして、最初の場合、たとえば「user-product」とこれを何が区別しますか?

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

  2. 2つの親のPK(論理レベルでエンティティとして存在しない論理 n :: n関係を物理テーブルに解決する)のみが含まれている場合、これは連想テーブルです。はい、通常、名前は2つの親テーブル名の組み合わせです。

    • 動詞句は、親から親へと適用され、親から親として読み取られ、子テーブルを無視する場合に注意してください。これは、2つの親を関連付けることだけが目的であるためです。

      図_C

    • 連想テーブルではない場合(つまり、2つのPKに加えて、データが含まれている場合)、適切に名前を付けると、関係の最後にある親ではなく、動詞句が適用されます。

      図_D

  3. 最終的に2つのuser_productテーブルになる場合、それはデータを正規化していない非常に大きな信号です。したがって、いくつかの手順に戻ってそれを行い、テーブルに正確かつ一貫した名前を付けます。その後、名前は自動的に解決されます。

命名規則

どんな助けも高く評価されます。皆さんがお勧めする命名規則の標準がある場合は、自由にリンクしてください。

あなたがやっていることは非常に重要であり、それはあらゆるレベルでの使いやすさと理解に影響を与えます。ですから、最初からできるだけ多くのことを理解しておくのは良いことです。SQLでコーディングを開始するまで、このほとんどの関連性は明確になりません。

  1. ケースは最初に取り上げる項目です。すべての大文字は受け入れられません。特にユーザーがテーブルに直接アクセスできる場合は、大文字と小文字が混在するのは正常です。データモデルを参照してください。シーカーが小文字の修飾されたNonSQLを使用している場合は、それを与えることに注意してください。その場合、アンダースコアを含めます(例に従って)。

  2. アプリケーションや使用法の焦点では​​なく、データの焦点を維持します。それは、2011年以来、1984年以来オープンアーキテクチャを導入しており、データベースは、それらを使用するアプリから独立しているはずです。

    このようにして、それらが成長し、1つのアプリがそれらを使用する以上に、ネーミングは意味のあるままであり、修正する必要はありません。(1つのアプリに完全に埋め込まれているデータベースはデータベースではありません。)データ要素にはデータのみの名前を付けます。

  3. 非常に配慮し、テーブルと列に非常に正確な名前を付けます。データ型のUpdatedDate場合は使用せず、を使用してください。投与量が含まれている場合は使用しないでください。DATETIMEUpdatedDtm_description

  4. データベース全体で一貫性を保つことが重要です。NumProduct1つの場所で製品の数を示しItemNoたりItemNum、別の場所で製品の数を示したりしないでください。一貫してNumSomething、numbers-of、および、SomethingNoまたはSomethingIdidentifierに使用します。

  5. 列名の前にテーブル名やのような短いコードを付けないでくださいuser_first_name。SQLはすでに修飾子としてテーブル名を提供しています:

        table_name.column_name  -- notice the dot
    
  6. 例外:

    • 最初の例外はPKです。PKは常に結合でコーディングし、データ列からキーを目立たせたいため、特別な処理が必要です。常に使用しuser_id、絶対に使用しないでくださいid

      • これがあることに注意していない接頭辞として使用されるテーブル名が、キーの構成要素のための適切な記述名は:user_idカラムであることを識別するユーザないiduserテーブル。
        • (もちろん、ファイルが代理によってアクセスされ、リレーショナルキーがないレコードファイリングシステムを除いて、それらはまったく同じものです)。
      • PKがFKとして運ばれる(移行される)場合は、常にキー列に正確に同じ名前を使用してください。
      • したがって、user_productテーブルにはuser_idPKのコンポーネントとしてがあります(user_id, product_no)
      • コーディングを始めると、これの関連性が明らかになります。まず、id多くのテーブルがあるので、SQLコーディングで簡単に混同されます。第二に、最初のコーダーが彼が何をしようとしていたのか誰も知らない。キー列を上記のように扱うと、どちらも簡単に防ぐことができます。
    • 2番目の例外は、同じ親テーブルテーブルを参照する複数のFKが子で実行される場合です。あたりとしてリレーショナル・モデル、利用のロール名の意味や用法を区別するために、例えば。AssemblyCodeそしてComponentCode2名PartCodes。そしてその場合、それらの1つに未分化を使用しないPartCodeでください。正確に。

      図_E

  7. 接頭辞
    100以上のテーブルがある場合は、テーブル名の前にサブジェクト領域を付けます。

    REF_
    OE_Order Entryクラスタなどの参照テーブル用

    論理レベルではなく、物理レベルでのみです(モデルが乱雑になります)。

  8. 接尾
    辞テーブルでは接尾辞を使用しないでください。他のすべての接尾辞は常に使用してください。つまり、データベースの論理的な通常の使用では、下線はありません。ただし、管理側では、下線が区切り記号として使用されます。

    _Vビュー(TableNameもちろんメインを前にして)
    _fk外部キー(列名ではなく制約名)
    _cacキャッシュ
    _segセグメント
    _trトランザクション(ストアドプロシージャまたは関数)
    _fn関数(非トランザクション)など

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

    サーバーからエラーメッセージが表示されると、これは非常に重要です。

    ____blah blah blah error on object_name

    違反したオブジェクトと、それが何をしようとしていたかを正確に把握できます。

    ____blah blah blah error on Customer_Add_tr

  9. 外部キー(列ではなく制約)。FKの最善の命名法は、動詞句(「それぞれ」と基数を差し引いたもの)を使用することです。

    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

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

    U一意、または_非一意の
    Cクラスター化、または_非クラスター化
    _セパレーター

    残りについて:

    • キーが1列またはごく少数の列の場合:
      ____ColumnNames

    • キーが数列を超える場合:
      ____ PK主キー(モデルごと)
      ____ AK[*n*]代替キー(IDEF1X用語)

    テーブル名は常に次のように表示されるため、インデックス名に必要ありません。table_name.index_name.

    したがって、Customer.UC_CustomerIdまたはProduct.U__AKエラーメッセージに表示された場合、それは何か意味のあることを伝えます。テーブルのインデックスを見ると、簡単に区別できます。

  11. 資格のある専門家を見つけてフォローしてください。彼らのデザインを見て、彼らが使う命名規則を注意深く研究してください。理解できないことについて具体的な質問をします。逆に、命名規則や標準にほとんど注意を払わない人からは地獄のように走ります。ここにあなたが始めるためのいくつかがあります:

    • これらには、上記のすべての実際の例が含まれています。このスレッドで質問に名前を付けて質問してください。
    • もちろん、モデルは、命名規則以外にもいくつか標準を実装しています。今のところそれらを無視するか、特定の新しい質問を気軽に行うことができます。
    • それらはそれぞれ数ページであり、Stack Overflowでのインライン画像サポートは鳥用であり、異なるブラウザで一貫してロードされません。リンクをクリックする必要があります。
    • PDFファイルには完全なナビゲーションがあるため、青いガラスのボタン、または展開が識別されているオブジェクトをクリックします。
    • Relational Modeling Standardに慣れていない読者は、IDEF1X表記法が役立つでしょう。

標準に準拠した住所での注文入力と在庫

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

完全な一時的機能を備えたセンサー監視

質問への回答

コメント欄でそれを合理的に回答することはできません。

Larry Lustig:
...最も簡単な例でさえも示します...
顧客が0対多の製品を持ち、製品が1対多のコンポーネントを持ち、コンポーネントが1対多のサプライヤーを持ち、サプライヤーがゼロを販売する場合対多のコンポーネントとSalesRepには1対多の顧客があり、顧客、製品、コンポーネント、およびサプライヤーを保持するテーブルの「自然な」名前は何ですか?

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

  1. あなたは自分の例を「最も簡単なもの」であると宣言しますが、それはそれ以外のものです。そのような矛盾があるので、技術的に能力があるかどうか、あなたが本気かどうかはわかりません。

  2. その「些細な」推測には、いくつかの大きな正規化(DB設計)エラーがあります。

    • それらを修正するまで、それらは不自然で異常であり、意味がありません。あなたはそれらにabnormal_1、abnormal_2などの名前を付けることもできます

    • あなたは何も供給しない「供給者」を持っています。循環参照(違法、および不要); 購入の基礎として、商品(InvoiceやSalesOrderなど)なしで製品を購入する顧客(または顧客が製品を「所有」しているか)。未解決の多対多の関係。等

    • それが正規化され、必要なテーブルが識別されると、それらの名前が明らかになります。当然。

いずれにせよ、私はあなたの質問に応えようとします。つまり、あなたが何を言っているのかわからずに、それに意味を加える必要があるので、ご容赦ください。重大なエラーは多すぎてリストすることができず、スペアの仕様を考えると、すべてを修正したとは思えません。

  • 製品がコンポーネントで構成されている場合、製品はアセンブリであり、コンポーネントは複数のアセンブリで使用されていると想定します。

  • また、「サプライヤーは0対多のコンポーネントを販売する」ため、製品やアセンブリ販売しないため、コンポーネントのみを販売します。

投機vs正規化モデル

ご存じない場合は、四角い角(独立)と丸い角(依存)の違いが重要です。IDEF1X表記のリンクを参照してください。同様に、実線(識別)と破線(非識別)。

...顧客、製品、コンポーネント、およびサプライヤーを保持するテーブルの「自然な」名前は何ですか?

  • お客様
  • 製品
  • コンポーネント(または、AssemblyComponent、一方のファクトがもう一方のファクトを識別することを理解する人向け)
  • サプライヤー

テーブルを解決したので、問題を理解できません。おそらく、特定の質問を投稿できます。

VoteCoffee:
2つのテーブル(user_likes_product、user_bought_product)の間に複数のリレーションシップが存在するRonnisの例に掲載されているシナリオをどのように扱いますか?私は誤解しているかもしれませんが、これにより、詳細な規則を使用してテーブル名が重複するようです。

正規化エラーがないと仮定すると、これUser likes Productは述語であり、表ではありません。それらを混同しないでください。主語、動詞、述語に関連する私の回答と、すぐ上のラリーに対する私の回答を参照してください。

  • 各テーブルには一連のファクトが含まれています(各行はファクトです)。述語(または命題)は事実ではなく、真実である場合とそうでない場合があります。

    • リレーショナル・モデルは、まず注文述語微積分(より一般的に第一階述語論理として知られている)に基づいています。述語は、真または偽に評価される、単純で正確な英語の単一句文です。

    • さらに、各テーブルは、1つではなく、多くの述語を表す、またはその実装です。

  • クエリは、述語(またはチェーンされた多数の述語)のテストであり、結果はtrue(事実が存在する)またはfalse(事実が存在しない)になります。

  • したがって、テーブルは、私の回答(命名規則)で詳しく説明されているように、行、ファクト、および述語を文書化する必要があります(必ず、データベースのドキュメントの一部です)が、述語の個別のリストとして名前を付ける必要があります。

  • これは、それらが重要ではないという示唆ではありません。それらは非常に重要ですが、ここでは書きません。

  • すぐに。以来リレーショナル・モデルが FOPCに設立され、データベース全体がFOPC宣言の集合、述語の集合であると言うことができます。ただし、(a)述部には多くのタイプがあり、(b)テーブルは1つの述部を表していません(これは、多くの述部とさまざまなタイプの述部の物理的な実装です)。

  • したがって、「the」述語のテーブルに「それが表す」という名前を付けることは、ばかげた概念です。

  • 「理論家」は少数の述語しか認識しておらず、RMがFOLに基づいて設立されたため、データベース全体が一連の述語であり、さまざまなタイプであることを理解していません。

    • そしてもちろん、彼らは知っている数少ない中から不条理なものを選びますEXISTING_PERSONPERSON_IS_CALLED。それがそれほど悲しくなければ、それは陽気なことでしょう。

    • 標準またはアトミックテーブル名(行に名前を付ける)は、すべての表現(テーブルにアタッチされているすべての述語を含む)に対して見事に機能することにも注意してください。逆に、ばかげた「テーブルは述語を表す」という名前はできません。これは、述語についてほとんど理解していないが、それ以外の点で遅れている「理論家」にとっては問題ありません。

  • データモデルに関連する述語、モデルで表現さ、2つの順序があります。

    1. 単項述語
      最初のセットは、ではなくテキストであり、表記自体です。これらにはさまざまな存在が含まれます。制約指向; および記述子(属性)述部。

      • もちろん、それは、標準データモデルを「読み取る」ことができる人だけがそれらの述語を読み取ることができることを意味します。そのため、テキストのみの考え方にひどく障害のある「理論家」はデータモデルを読むことができず、1984年以前のテキストのみの考え方に固執します。
    2. バイナリ述語
      2番目のセットは、ファクト間の関係を形成するものです。これが関係線です。動詞句(上記で詳述)は、実装されている述語(命題)を識別します(クエリを介してテストできます)。それ以上に明確にすることはできません。

      • したがって、標準データモデルに堪能な人にとって、関連するすべての述語モデルに文書化されます。述語の個別のリストは必要ありません(ただし、データモデルからすべてを「読み取る」ことができないユーザーは必要です)。
  • これは、私が述語をリストしたデータモデルです。Existentialなどの述語と、Relationshipの述語が表示されるため、この例を選択しました。リストされていない述語は記述子のみです。ここでは、シーカーの学習レベルのため、私は彼をユーザーとして扱います。

したがって、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のパフォーマンスでは、「大丈夫」でしょう。さらに、それはあなたのデータベースがサロゲートでいっぱいであり、それらの領域でのリレーショナルではないことを示しています。これは、パフォーマンスが非常に低く、整合性が不足していることを意味します。


3
優れたクリーンアップ、ありがとうございます。すべての良いコメント(スター付き、投票済み)もなくなりました。ああ、それは時間を与えて、彼らは戻ってきます。
PerformanceDBA

3
投稿には76件のコメントがあり、それらすべてから何かを抽出することはほぼ不可能であるため、価値のあるものはすべて回答に編集する必要がありました。
タリン

3
@PerformanceDBA。「これは私がスターを付けたいだけの種類の答えです」などのコメントは、答えに移すべきでありませ。組み込む必要があるのは、説明を求めたり、エラーを指摘したりするコメントへの回答です。
ChrisF

2
@ChrisF。(a)説明ありがとうございました、以前のモデレーターの行動がわかりませんでした。(b)質問を再度開くことはできますか?それを閉じる試みは明らかにエラーです(質問に対する私のコメントを参照してください)。そうでない場合、SOは良い質問/回答を失い続け、新しい質問/回答がそれらに取って代わります。ヘルプには「私たちは素晴らしい答えを失うのは好きではありません!」とあります。ありがとう。
PerformanceDBA

12
これらの「規格」への参照を提供できますか?現在、これは非常によく書かれた個人的な意見です。
Shane Courtrille 16

18

単数形と複数形:1つを選んでそれに固執します。

列に接頭辞/接尾辞/接頭辞を付けたり、列であることを参照して固定したりしないでください。同じことがテーブルにも言えます。テーブルにEMPLOYEE_TまたはTBL_EMPLOYEESという名前を付けないでください。2番目のテーブルはビューに置き換えられるため、混乱を招きます。

varcharの「vc_firstname」や「flavour_enum」などの名前に型情報を埋め込まないでください。また、「department_fk」や「employee_pk」などの制約を列名に埋め込まないでください。

実は、私は考えることができる*修正に関する唯一の良いところは、あなたのような予約語を使用することができるということですwhere_ttbl_orderuser_vw。もちろん、これらの例では、複数形を使用することで問題は解決されます:)

すべてのキーに「ID」という名前を付けないでください。同じものを参照するキーは、すべてのテーブルで同じ名前にする必要があります。ユーザーID列は、ユーザーテーブルとそのユーザーを参照するすべてのテーブルでUSER_IDと呼ばれます。名前が変更されるのは、Message(sender_user_id、receiver_user_id)など、さまざまなユーザーがさまざまな役割を果たしている場合のみです。これは、より大きなクエリを処理するときに本当に役立ちます。

CaSeについて:

thisiswhatithinkofalllowercapscolumnnames.

ALLUPPERCAPSISNOTBETTERBECAUSEITFEELSLIKESOMEONEISSCREAMINGATME.

CamelCaseIsMarginallyBetterButItStillTakesTimeToParse.    

i_recommend_sticking_with_lower_case_and_underscore

一般に、参照されるテーブルの名前ではなく、それが説明する関係に一致するように「マッピングテーブル」に名前を付けることをお勧めします。ユーザーは、製品に関係の任意の数を持つことができますuser_likes_productuser_bought_productuser_wants_to_buy_product


5
下線を見る方が好きです。しかし、私はキャメルケースを入力することを好みます。アンダースコアについては何かがあります...どれだけ練習しても、キーボードを停止する必要があります。
ティドゥス卿、2011年

@ロニス、「すべてのキーにIDを付けないでください」について詳しく説明してください。同じものを参照するキーは、すべてのテーブルで同じ名前にする必要があります。 ""?
トラビス

@Travis、確かにできますが、その段落全体が詳細ですか?
ロニス

私の質問は、列が修飾子として接頭辞が付いたテーブル名でのみ参照されるため、{table_name}_id単なるidではなく(区別されていないロール)合成主キーに名前を付けることの利点についてだと思いtable_name.idます。 コンテキストについては、フォームの結合構文がtable_a JOIN table_b ON table_b_id_columnサポートされていないエコシステムで操作しています。しなきゃtable_a JOIN table_b ON table_b.id_column = table_a.table_b_id_column
Travis

私にとって、これは明快さと論理データモデルについてです。USER_IDとCOMPANY_IDに番号シーケンスを使用すると、これらの値の一部はもちろん同じになります。ただし、USER_IDの123は、COMPANY_IDの123とは異なります。これは、値が異なるドメインから取得されるためです。このように、それらに異なる名前を付けることは理にかなっています。
ロニス

16

単数と複数の「正しい」というものはありません-それは主に好みの問題です。

それはあなたの焦点に一部依存します。テーブルを1つの単位と考えると、「複数」が保持されます(多くの行が保持されるため、複数の名前が適切です)。テーブル名をテーブル内の行を識別するものと考える場合は、「単数形」を好むでしょう。これは、SQLがテーブルの1つの行で作業していると見なされることを意味します。それは大丈夫ですが、通常は単純化しすぎです。SQLは(多かれ少なかれ)セットで機能します。ただし、この質問への回答は単数で行くことができます。

  1. おそらくテーブル「user」、別の「product」、およびユーザーを製品に接続するための3番目が必要であるため、テーブル「user_product」が必要です。

  2. 説明は製品に適用されるため、「product_description」を使用します。各ユーザーが各製品に自分で名前を付けない限り...

  3. 「user_product」テーブルは、製品IDとユーザーIDだけを含むテーブルの例です(またはその可能性があります)。同じ一般的な方法で2つの属性テーブルに名前を付けます: 'user_stuff'。'rel_'のような装飾的なプレフィックスは実際には役に立ちません。たとえば、各テーブル名の前に 't_'を使用している人がいます。それは多くの助けではありません。


「ユーザーを接続するための3番目」と言うとき。3つ目のテーブルですか?1対多の関係(ユーザーが多くの製品を持っている)で3番目のテーブルが必要なのはなぜですか ところで、UserProductではなくuser_productを使用することをお勧めしますか?
Andreas

私の答えは、システムが認識している製品をリストした表があることを前提としています。システムが知っているユーザーをリストしたテーブルもあるはずです。また、(私の仮説では)特定の製品に複数のユーザーを関連付けることができるため、「user_product」(または「product_user」)という名前の3番目のテーブルがあります。実際にテーブルが2つしかないため、各ユーザーの製品がそのユーザーに固有であり、他のユーザーには使用されていない場合、(a)異常なシナリオがあり、(b)2つのテーブルしか必要ない-必要ない私が仮定した「製品」の表。
ジョナサンレフラー、2011年

申し訳ありませんが、製品よりも良い例を使用する必要がありました。それは、製品がユーザーに固有であるという意味です。これをクリアしてだから、私は製品を取ったものを恐ろしい例を参照私が知っている...それは、ユーザー/製品のためにもユニークなので記述テーブルは、「user_product_description」であるべきと仮定:)ありがとう
アンドレアス

@Andreas:良い例を選択するのは難しいことが多く、問題の1つは、製品テーブルに何が含まれるかについての人々の先入観です。ただし、明確にすると、「user」、「user_product」、および「user_product_description」がテーブル名として適切であるように見えます。
ジョナサンレフラー、2011年

4

複数形は、一貫して使用されている限り問題ではありませんが、私の好みは単数形です。

多対多の関係の概要を説明したくない場合は、アンダースコアを省略します。ORMでの区別に役立つため、初期資本を使用します。

しかし、多くの命名規則があるため、アンダースコアを使用したい場合は、一貫して行われていれば問題ありません。

そう:

User

UserProduct (it is a users products after all)

1人のユーザーだけが製品を所有できる場合

UserProductDescription

ただし、製品がユーザーによって共有されている場合:

ProductDescription

多対多の関係のためにアンダースコアを保存すると、次のようなことができます。

UserProduct_Stuff

UserProductとStuffの間でM-to-Mを形成するために-必要な多対多の正確な性質は質問からはわかりません。


私はこれが好きで、それを行う良い方法のようです。ここで私が疑問に思う唯一のことは、私はアンダースコアを多対多に「保存する必要がある」ので、テーブルの大文字の名前を使用することを「持っている」必要があります。なぜなのかはわかりませんが、どういうわけかそれをテーブル名に使用するべきではなく、列にのみ使用するべきであることがわかりました。
Andreas

@Andreasテーブルに大文字を使用する必要はありません。異なる単語の最初の文字を大文字にしてください。
amelvin、2011年

2

単数形を使用するのは複数形よりも正確ではありません。どこで聞いたことがありますか?データベーステーブルの命名には複数形がより一般的であると言いたいのですが、私の意見ではより論理的でもあります。ほとんどの場合、テーブルには複数の行が含まれます;)概念モデルでは、エンティティの名前は単数であることがよくあります。

あなたの質問について、もし 'Product'と 'ProductDescription'があなたのモデルのアイデンティティ(すなわちエンティティ)を持つコンセプトであるならば、私は単にテーブル 'Products'と 'ProductDescriptions'を呼ぶでしょう。多対多の関係を実装するために使用されるテーブルでは、「Student2Course」などの命名規則「SideA2SideB」を最もよく使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.