データベース、テーブル、列の命名規則?[閉まっている]


791

データベースを設計するときはいつでも、データベース内のアイテムに名前を付ける最善の方法があるかどうか常に疑問に思います。多くの場合、私は自分に次の質問をします。

  1. テーブル名は複数にする必要がありますか?
  2. 列名は単数である必要がありますか?
  3. テーブルまたは列にプレフィックスを付ける必要がありますか?
  4. アイテムの命名に大文字と小文字を使用する必要がありますか?

データベースのアイテムに名前を付けるための推奨ガイドラインはありますか?


7
テーブルには複数、列には単数の名前を付ける必要があると思います。
AZ_ 2011

7
テーブルを単一の「エンティティ」ではなく、複数のアイテムを含む「ストレージ」と見なしているので、複数の名前を付けます。テーブルをオブジェクトにマッピングするとき、オブジェクトに単数形の名前を付けます。これは私の個人的な意見です。
2013

2
@Tryinko IDをいたるところに使用することは、複数のテーブルの結合を実行するすべての人にとって生きがいです。これがPKであることを知っていることのわずかな利点が、すべての流血のクエリで何度も何度もdang ID列を再エイリアスするという信じられないほどの煩わしさよりも勝る方法はありません。テーブルでPKを示す方法が必要な場合は、それを最初の列にします。また、列の名前にFKを示すことは、私の心の中で、もう1つの強く邪悪なアンチパターンです。
ErikE 2016

回答:


315

MicrosoftのSQL Serverサンプルデータベースを確認することをお勧めします。https//github.com/Microsoft/sql-server-samples/releases/tag/adventureworks

AdventureWorksサンプルでは、​​データベースオブジェクトの編成にスキーマ名を使用する、非常に明確で一貫した命名規則を使用しています。

  1. テーブルの単数形の名前
  2. 列の単数形の名前
  3. テーブルプレフィックスのスキーマ名(例:SchemeName.TableName)
  4. パスカルケーシング(別名キャメルケース)

14
wilsonmar.com/sql_adventureworks.htmは、AdventureWorksスキーマの優れた分析です。
Daniel Trebbien、2011年

209
私はどの標準もMicrosoftに依存しません。ノースウィンドデータベースを見ると、複数のテーブル、単数列名、テーブルのスキーマプレフィックス、主キー列のテーブルプレフィックス、ハンガリー風の制約のプレフィックス、最悪のものが使用されていることがわかります。すべてのスペースの ""マルチワードテーブル名。さらに、SQLServerのシステムテーブルは複数形を使用しているため、AdventureWorksはこの一群の黒い羊でした。
マーカス・ポープ

63
ここでの主な問題は、Singularテーブル名の群集は、Plural群集が行うテーブルの行ではなく、テーブルをエンティティと見なしているように見えることです。それが何であるかをあなた自身に尋ねなければなりません。テーブルが行のコンテナーである場合、複数の名前を使用する方が論理的ではありませんか?コードで単数のコレクションに名前を付けることは決してないでしょう。それでは、なぜテーブルに単数の名前を付けるのでしょうか。なぜ矛盾があるのですか?結合でどのように並べ替えて使用するかについてのすべての議論を聞きますが、それらはすべて非常に薄っぺらな議論のようです。それがすべて好みに帰着するなら、私は一貫性を持って行き、複数形にします。
ジェイソン

4
また、潮の流れの方向も考慮してください。特にSQL Serverのすべてのシステムテーブルはすべて複数であり、Entity Frameworkのデフォルトは複数であるので、複数のテーブル名の方向に進んでいるようです。それがマイクロソフトのスタンスだとしたら、20年後の方向性を考えていきたいと思います。Oracleのデータベース規約でさえ、複数のテーブル名を使用しています。"var"キーワードが導入されたときに、それを嫌うc#開発者の数を考えてみてください。今では、変数を定義するために広く受け入れられている方法です。
Jason

7
@ジャスミン-あなたの見解はわかりますが、サンプルテーブルの名前を誤って逆にしていると思います。「TableOfInvoices」は「Invoices」に短縮する必要があります。おそらく、代わりに「InvoiceTable」を意味していましたが、これは「Invoice」を短縮する意味があります。
デレク

280

ここで遅い答えですが、要するに:

  1. 私の好みは複数です
  2. はい
  3. テーブル:*通常*接頭辞は最適ではありません。 :いいえ。
  4. テーブルと列の両方:PascalCase。

詳細:

(1)あなたがしなければならないこと。毎回特定の方法で行う必要がある ことほとんどありませんが、いくつかあります。

  • 「[singularOfTableName] ID」形式を使用して主キーに名前を付けます。つまり、テーブル名がCustomerでもCustomersでも、主キーはCustomerIDである必要があります。
  • さらに、外部キーは異なるテーブルで一貫して名前を付ける必要あります。これを行わない人を殴打することは合法であるべきです。定義された外部キー制約がしばしば重要である一方で、一貫した外部キ​​ーの命名が常に重要であると私は提出します
  • データベースには内部規則が必要です。後のセクションで、私は非常に柔軟であることがわかりますが、データベース内では、ネーミングは非常に一貫している必要があります。顧客用のテーブルの名前をCustomersとするCustomerとするかは、同じデータベース全体で同じように行うよりも重要ではありません。コインを裏返してアンダースコアの使用方法を決定することもできますが、同じように使用し続ける必要あります。これをしなければ、あなたは低い自尊心を持つべき悪い人です。

(2)何をすべきか。

  • 異なるテーブルの同じ種類のデータを表すフィールドには、同じ名前を付ける必要があります。1つのテーブルにZipを設定し、別のテーブルにZipCodeを設定しないでください。
  • テーブル名または列名の単語を区切るには、PascalCasingを使用します。camelCasingを使用しても本質的に問題はありませんが、それは慣例ではなく、面白​​そうです。アンダースコアについては後で説明します。(昔のようにALLCAPSを使用することはできません。OBNOXIOUSTABLE.ANNOYING_COLUMNは、20年前のDB2では大丈夫でしたが、現在では大丈夫です。)
  • 人工的に単語を短くしたり、省略したりしないでください。名前は短くて混乱するよりも長くて明確である方が良いです。超短い名前は、より暗い、より野蛮な時代からのホールドオーバーです。Cus_AddRef。それは一体何ですか?保管宛先参照?顧客の追加払い戻し?カスタムアドレス紹介?

(3) 考慮すべきこと。

  • テーブルには複数の名前を付ける必要があると思います。単数だと思う人もいます。他の場所で議論を読んでください。ただし、列名は単数形でなければなりません。複数のテーブル名を使用する場合でも、他のテーブルの組み合わせを表すテーブルは単数形になる場合があります。たとえば、プロモーションがある場合テーブルとItemsテーブルの一部であるアイテムを表すテーブルはPromotions_Itemsになる可能性がありますが、正当に考えると、1対多の関係を反映したPromotion_Itemsになる可能性もあります。
  • アンダースコアは、一貫して特定の目的で使用してください。PascalCasingを使用すると、一般的なテーブル名だけで十分明確になります。単語を区切るためにアンダースコアは必要ありません。下線を保存して、(a)連想テーブルを示すか、(b)プレフィックスを付けます。これについては、次の箇条書きで説明します。
  • プレフィックスは良いものでも悪いものでもありません。それは通常最善ではありません。最初の1つまたは2つでは、テーブルの一般的な主題別グループ化に接頭辞を使用することはお勧めしません。テーブルは最終的にカテゴリに適合しなくなり、実際にはテーブルを見つけにくくなる可能性があります。経験があれば、害よりも効果的な接頭辞スキームを計画して適用できます。私は、データテーブルが始まった場所を一度デシベルで働いていたTBLとテーブルを設定ファイル、CTBLと、ビューVEW、PROCのSP、およびUDFの FN、および他のいくつか。それは細心の注意を払って、一貫して適用されたので、大丈夫でした。接頭辞が必要になるのは、なんらかの理由で同じデータベースに常駐する本当に別のソリューションがある場合のみです。プレフィックスを付けると、テーブルをグループ化するのに非常に役立ちます。プレフィックスは、一時テーブルを目立たせたい場合など、特別な状況でも問題ありません。
  • 列にプレフィックスを付けることはほとんどありません(あるとしても)。

11
「異なるテーブルの同じ種類のデータを表すフィールドには同じ名前を付ける必要があります。1つのテーブルにZipを指定し、別のテーブルにZipCodeを指定しないでください。」はいはい100万回はい 私たちのデータベースはそのように設計されていなかったと言えますか?Personidは、12の異なる方法のいずれかで参照される可能性があり、維持するのが非常に面倒です。私は、設計を制御できたすべてのデータベースでこのルールを常に守ってきました。
HLGEM 2010年

87
主キーは「ID」だけでよいと思います。このような単純な規則により、主キーが予測可能になり、すばやく識別できるようになります。ただし、他のテーブルで外部キーとして使用される場合は、テーブル名( "PersonID")を付加します。この規則は、同じテーブル内の主キーと外部キーを区別するのに役立ちます。
Triynko 2010

55
@Tryinko IDをいたるところに使用することは、複数のテーブルの結合を実行するすべての人にとって生きがいです。これがPKであることを知っていることのわずかな利点が、すべての流血のクエリで何度も何度もdang ID列を再エイリアスするという信じられないほどの煩わしさよりも勝る方法はありません。テーブルでPKを示す方法が必要な場合は、それを最初の列にします。また、列の名前にFKを示すことは、私の心の中で、もう1つの強く邪悪なアンチパターンです。
ErikE 2011年

18
@Triynkoで "ID"のみを使用すると、それが属しているテーブルを判別することもプログラム上不可能になります。テーブル名の接頭辞を使用すると、主キーの最後の2桁を切り捨て、コードを介してそれが属するテーブル名を知ることができます。多くの場合、ITとDBAの人々は、特定の方法でデータベースを設計するプログラマにとってコーディング上の利点があることを理解していません。
dallin 2013

16
@ErikEつまりCustomerIDCustomerテーブルの主キーなのか、他のテーブルの外部キーなのかわからないということです。軽微な問題です。なぜあなたは次のような貧弱な名前を使いたいのcですか?CustomerID = Customer.ID外部キーと主キーを結合していることがわかります。2つの側面は2つの異なるものであるため、冗長ではありません。単一文字の名前付けは、慣行としては不十分です。
Dave Cousineau、

100

OK、私たちは意見を検討しているので:

テーブル名は複数である必要があると思います。テーブルは、エンティティのコレクション(テーブル)です。各行は単一のエンティティを表し、テーブルはコレクションを表します。だから私はPersonエンティティのテーブルをPeople(またはPersons、あなたの好きなものは何でも)と呼びます。

クエリで単一の「エンティティ名」を確認したい場合は、テーブルエイリアスを次のように使用します。

SELECT person.Name
FROM People person

LINQの「from person in people select person.Name」に少し似ています。

2、3、4については、@ Larsに同意します。


17
@Emtucifor:英語では、「その人の群れの中にいる人をすべて見てください!」とは言いません。単数の単語で複数参照されているものに概念的な問題があることが予想されます。それは通常でも適切でもありません。「データ」は例外的であり、「ケーキ」のように、物質のボリュームの一部を指すためによく使用されます。「(ケーキの)ケーキはいかがですか?」テーブルに「People」という名前を付けると、複数の個人に関する情報が含まれるため、「Person」という名前を付けるよりもはるかに理にかなっています。ROWの「Person」という名前のデータクラスは、単一の列名と同様に意味があります。
Triynko 2010

6
@Emtucifor:結局のところ、すべての言語は恣意的で慣習的です。私は、従来、アイテムのコレクションをアイテムのタイプの複数形と呼んでいるとちょうど主張していました。したがって、各行に1人の個人に関する情報が含まれている行のコレクションは、Peopleのコレクションとして参照されます。しかし、それをPersonのコレクションとして参照したい場合は、すぐに進んでください。
Triynko、2010

3
@Emtucifor:はい、笑。テーブルに「PersonCollection」という名前を付けることは、「People」という名前を付けることと同じです。そのようなコレクションに「Person」という名前を付けるのとは対照的ですが、意味がありません:)
Triynko 2010

4
@Emtucifor:次に、別の角度から考えて、命名規則をコンテキストに入れましょう。行とテーブルの両方を表すオブジェクトクラスがあるとします。「Person」は、データの行を表すクラスにとって明らかに意味があります。テーブルも「Person」という名前だった場合、名前の競合や混乱が生じる可能性があります。正確な複数でオブジェクトに名前を付ける方が理にかなっていると私は思う。人と呼ばれるべき人、人や複数の人物についての情報を持つテーブルについてのデータを持つ行が呼ばれた人々など、PersonCollection、人、
Triynko

5
@ジョシュ・M.まあ、どちらに行くのでもありません。私のやり方で行けば、Peopleテーブルのエイリアスを "person"にして、SELECT person.Nameにすることができます。問題が解決しました。;-)
Matt Hamilton、

73

私は3人のDBAがいるデータベースサポートチームで働いています。

  1. 命名基準は、基準がない場合よりも優れています。
  2. 「真の」標準はありません。私たち全員が好みを持っています
  3. すでに標準がある場合は、それを使用します。別の標準を作成したり、既存の標準を濁らせたりしないでください。

テーブルには単数形の名前を使用します。テーブルには、システムの名前(またはその頭字語)が前に付けられる傾向があります。これは、プレフィックスを変更してテーブルを論理的にグループ化できるため(たとえば、reg_customer、reg_booking、およびregadmin_limits)、システムが複雑な場合に役立ちます。

フィールドの場合、フィールド名にはテーブルのプレフィックス/アクリオン(例:cust_address1)が含まれると想定し、標準のサフィックスセット(PKの場合は_id、 "code"の場合は_cd、 "nameの場合は_nm "、_nbは「数値」、_dtは「日付」)。

Foriegnキーフィールドの名前は、主キーフィールドと同じである必要があります。

すなわち

SELECT cust_nm, cust_add1, booking_dt
FROM reg_customer
INNER JOIN reg_booking
ON reg_customer.cust_id = reg_booking.cust_id

新しいプロジェクトを開発するときは、推奨されるエンティティ名、プレフィックス、頭字語をすべて書き出し、このドキュメントを開発者に提供することをお勧めします。その後、新しいテーブルを作成することを決定した場合、テーブルとフィールドの名前を「推測」するのではなく、ドキュメントを参照できます。


9
特に3番については、同じ会社から雇われた人々のグループがあり、彼らは何でもすることに古い命名基準(他の誰も使用しなかった)を課そうとしました。とてもうるさい。
HLGEM 2010年

40
確かにSQLが読めなくなります。翻訳できると思います。cust_nmはCustomerNameで、booking_dtはBookingDateである必要があります。reg_customer、それが何なのか私にはわかりません。
Ian Boyd

3
@イアン。その意図は、あなたが慣れ親しんだ命名規則に固執し、一貫性を保つことです。私は常に、日付フィールドは_dt、名前フィールドは_nmであることを知っています。'reg'は「登録」システム(ブッキング、顧客など)の例であり、すべての関連テーブルには同じ接頭辞が付きます。しかし、それぞれが独自に...
Guy

7
特定の基準は、一貫した基準を持つことほど重要ではないことに同意します。しかし、いくつかの基準は間違っています。CSPTCN、CSPTLN、CSPTMN、CSDLNなどのDB2および列名。長い名前が発明されたことを人々は知っておくべきです-私たちは物を読みやすくする余裕があります。
Ian Boyd

17
長年にわたって、私が開発して販売したアプリのテーブルの最後に新しい列を追加しています。場合によっては、列に英語の名前を使用したり、スペイン語を使用したり、場合によっては、列を削除したり、使用されているものを説明する適切な名前で新しい列を追加したりするのではなく、別の目的で列を再利用したりします。他の誰かが私のコードをハッキングまたはリバースエンジニアリングしようとした場合に備えて、ソースコードを難読化するために意図的にこれを行いました。私だけが理解できます。他の誰かがイライラします!..このように、彼らはいつも私に頼らなければなりません!
フランクR.

47
  1. いいえ。テーブルは、それが表すエンティティに基づいて名前を付ける必要があります。人ではなく人が、レコードの1つが表す人をどのように参照するかです。
  2. 繰り返しますが、同じことです。列FirstNameは、実際にはFirstNamesと呼ばれるべきではありません。それはすべて、列で何を表現するかによって異なります。
  3. 番号。
  4. はい。明確にするためにケースに入れてください。「FirstName」のような列が必要な場合は、大文字にすることで読みやすくなります。

OK。それは私の$ 0.02


5
番号3をいくらか明確にする-プレフィックスは、メタデータを列名に埋め込む方法です。ハンガリー語の表記法と同様の理由で、現代のDBではこれを行う必要はありません。
Mark McDonald

21
「注文からトップ15を選択」または「注文からトップ15を選択」?後者は私の(人間の)好みです。
Ian Boyd、

8
@Ian Boyd:はい:SELECT TOP 100 * FROM Report R INNER JOIN VisitReport VR ON R.ReportID = VR.ReportID。それはすべて、あなたがそれについてどう考えるかによって異なります。レモンの写真をキャニスターに置くと、中にレモンが複数あることを示すために外側に2つのレモンがなくても、レモンが入っていることがわかります。もちろん、「lemons」と書かれた言葉でラベルを付けることもできます。しかし、それはちょうど「レモン」かもしれません。「レモン」というリソースを取得するには、こちらにアクセスしてください。
ErikE 2010年

6
列名にUpperCaseを使用する場合は$ 0.01を追加し、列名にアンダースコアを使用する場合は$ 0.01を追加して、簡単に列名を区別しやすくします。合計= 0.02ドルの寄付
フランクR.

6
「テーブルは、それが表すエンティティにちなんで名前を付ける必要があります」テーブルはエンティティのコレクションです。テーブルもエンティティですが、名前に追加しても意味がない「テーブル」タイプのエンティティです。
Trisped

34

ISO / IEC 11179スタイルの命名規則にも賛成です。これらは規範的というよりはガイドラインであることに注意してください。

Wikipediaのデータ要素名を参照してください。

「テーブルはエンティティのコレクションであり、コレクションの命名ガイドラインに従います。理想的には、集合的な名前が使用されます:例:Personnel。複数も正しい:Employees。不正な名前には、Employee、tblEmployee、およびEmployeeTableが含まれます。」

いつものように、ルールには例外があります。たとえば、常に正確に1行を持つテーブルは、構成テーブルなどの単一の名前の方が良い場合があります。そして、一貫性は最も重要です:あなたが買い物をするかどうかを確認し、そうであれば、それに従ってください。気に入らない場合は、唯一のレンジャーではなく、ビジネスケースを実行して変更してください。


-1:参照されているテキストはISO / IEC 11179とは関係ありません。参照されているウィキペディアのページは信頼すべきではありません。代わりに、実際の標準を読んで(metadata-standards.org/11179/#A5
mkadunc

@onedaywhen:ウィキペディアのページを修正するのに十分なほど件名を知りません。また、ウィキペディアのページは誤解を招くほど間違っているわけではありません。ISO/ IEC 11179にデータベースの命名規則が含まれていることは明記されておらず、「ISO / IEC 11179は、リレーショナルデータベース」。次に、リレーショナルデータベースに使用できる命名規則の例を示します。この例は、Wikipediaの記事の執筆者が実際に作成したものである場合、標準から取られたものであると考えることができます。
mkadunc

27

テーブルが複数形であるかどうかはすべて個人的な好みの問題であり、ベストプラクティスは存在しないという議論は常に耳にします。特にDBAとは対照的に、プログラマーとしてはそうだとは思いません。私が知る限り、テーブル名を単数にすることによってコードに正当な利点がある一方で、「オブジェクトのコレクションだからこそ意味がある」以外にテーブル名を複数形にする正当な理由はありません。例えば:

  1. 複数のあいまいさによるバグやミスを回避します。プログラマーはスペルの専門知識で正確に知られていないため、いくつかの単語を複数形にすると混乱を招きます。たとえば、複数形の単語は「es」または単に「s」で終わりますか?それは人ですか、それとも人ですか。大きなチームでプロジェクトに取り組むとき、これは問題になることがあります。たとえば、チームメンバーが間違ったメソッドを使用して、作成したテーブルを複数形にした場合です。このテーブルを操作するまでに、アクセスできないコードや修正に時間がかかりすぎるコード全体で使用されます。その結果、テーブルを使用するたびにスペルを間違えることを覚えておかなければなりません。これとよく似たことが私に起こりました。チームのすべてのメンバーが一貫して簡単に正確に使用できるようにするのは簡単です。エラーなしでテーブル名を修正するか、常にテーブル名を検索する必要がある方が良いでしょう。単一バージョンは、チーム環境での処理がはるかに簡単です。

  2. テーブル名の単一バージョンを使用し、主キーの前にテーブル名を付けると、コードのみで主キーからテーブル名を簡単に決定できる、またはその逆の利点があります。テーブル名を含む変数を指定し、「Id」を最後に連結すると、追加のクエリを実行しなくても、コードを介してテーブルの主キーを取得できます。または、主キーの末尾から「Id」を切り取って、コードでテーブル名を決定できます。主キーのテーブル名なしで "id"を使用する場合、主キーからテーブル名をコードで判別することはできません。さらに、テーブル名を複数化し、PK列にテーブル名のプレフィックスを付けるほとんどの人は、PKでテーブル名の単数バージョンを使用します(たとえば、statusesおよびstatus_id)。

  3. テーブル名を単数にすると、それらが表すクラス名と一致させることができます。繰り返しになりますが、これによりコードが単純化され、テーブル名のみを持つことでクラスをインスタンス化するなど、本当にきちんとしたことができるようになります。それはまたあなたのコードをより一貫性のあるものにするだけで、それは...につながります

  4. テーブル名を単数にすると、命名体系が一貫し、整理され、すべての場所で維持しやすくなります。コード内のすべてのインスタンスで、列名、クラス名、テーブル名のいずれであっても、まったく同じ名前であることがわかります。これにより、グローバル検索を実行して、データが使用されているすべての場所を確認できます。テーブル名を複数形にすると、そのテーブル名の単数形(主キーで変換されるクラス)を使用する場合があります。データが複数形と呼ばれるインスタンスと単数形と呼ばれるインスタンスがないことは、理にかなっています。

要約すると、テーブル名を複数形にすると、コードをよりスマートで扱いやすくするためのあらゆる種類の利点が失われます。テーブル名をオブジェクトまたはローカルコード名に変換するためにルックアップテーブル/配列を使用しなければならない場合さえあります。単数形のテーブル名は、最初は少し変な感じがするかもしれませんが、複数形の名前に比べて大きな利点があり、ベストプラクティスだと思います。


26

私たちの好み:

  1. テーブル名は複数にする必要がありますか?
    決して。それがコレクションであるという議論は理にかなっていますが、テーブルに何が含まれるか(0、1、または多くのアイテム)はわかりません。複数のルールにより、命名が不必要に複雑になります。1つの家、2つの家、ネズミとネズミ、人と人、そして私たちは他の言語も調べていません。

    Update person set property = 'value'テーブル内の各人に作用します。
    Select * from person where person.name = 'Greg'個人の行のコレクション/行セットを返します。

  2. 列名は単数である必要がありますか?
    通常、はい。ただし、正規化ルールに違反している場合を除きます。

  3. テーブルまたは列にプレフィックスを付ける必要がありますか?
    主にプラットフォームの設定。列の前にテーブル名を付けることをお勧めします。テーブルにはプレフィックスを付けませんが、ビュー(v_)とstored_procedures(sp_またはf_(関数))にプレフィックスを付けます。これは、実際にはビューの計算フィールドであるv_person.ageを更新しようとする人に役立ちます(とにかく更新できません)。

    また、キーワードの衝突を回避するための優れた方法です(delivery.fromは中断しますが、delivery_fromは中断しません)。

    それはコードをより冗長にしますが、多くの場合読みやすさを助けます。

    bob = new person()
    bob.person_name = 'Bob'
    bob.person_dob = '1958-12-21'
    ...は非常に読みやすく明示的です。ただし、これは手に負えなくなる可能性があります。

    customer.customer_customer_type_id

    はcustomerとcustomer_typeテーブルの関係を示し、customer_typeテーブル(customer_type_id)の主キーを示します。クエリをデバッグしているときに 'customer_customer_type_id'が表示された場合は、(customerテーブル)の場所がすぐにわかります。

    または、customer_typeとcustomer_categoryの間にMM関係がある場合(特定のカテゴリでは特定のタイプのみが使用可能)

    customer_category_customer_type_id

    ...は長い(!)です。

  4. アイテムの命名に大文字と小文字を使用する必要がありますか?はい-小文字:)、下線付き。これらは非常に読みやすく、クロスプラットフォームです。上記の3と組み合わせることも意味があります。

    これらのほとんどは設定ですが。-あなたが首尾一貫している限り、それを読む必要がある人は誰でも予測できるはずです。


1
SELECT * FROM people AS person WHERE person.name = 'Greg'私にとって最も自然に聞こえます。
ケンモア2016

1
@Zukoほとんどの場合、テーブルの主キーの命名規則は<table name><id>、たとえばPersonIDなどですPerson_ID。したがって、各レコードは人ではなく別の人であるため、テーブルに複数の名前を付けない方が理にかなっています。
ブロンド氏、

20

ISO 11179-5:命名と識別の原則をご覧ください。こちらから入手できます:http ://metadata-standards.org/11179/#11179-5

私はしばらくここにブログを書きました:ISO-11179命名規則


19
ここに要約を記載すると、回答がよりアクセスしやすくなります(=より良い)。素晴らしいポインタですが!
OlaEldøy2009

15

私はこれがゲームに遅れていることを知っており、質問はすでに非常によく回答されていますが、列名の接頭辞に関する#3についての私の意見を提供したいと思います。

すべての列には、それらが定義されているテーブルに固有の接頭辞を付けた名前にする必要があります。

たとえば、「customer」と「address」というテーブルがある場合、それぞれ「cust」と「addr」の接頭辞から始めましょう。「customer」には「cust_id」、「cust_name」などが含まれます。「address」には、「addr_id」、「addr_cust_id」(お客様にFKで返信)、「addr_street」などが含まれます。

私が最初にこの標準を提示されたとき、私はそれに対して完全に不満でした。私はその考えを嫌っていました。余分なタイピングと冗長性のすべてのアイデアに我慢できませんでした。今では、二度と戻れないほどの十分な経験があります。

これを実行すると、データベーススキーマのすべての列が一意になります。これには大きな利点が1つあります。これは、(もちろん、私の意見では)それに対するすべての議論よりも優先されます。

コードベース全体を検索して、特定の列に接触するコードのすべての行を確実に見つけることができます。

#1のメリットは非常に大きいです。列を非推奨にし、列をスキーマから安全に削除する前に更新する必要があるファイルを正確に知ることができます。列の意味を変更して、リファクタリングする必要があるコードを正確に知ることができます。または、列のデータがシステムの特定の部分で使用されているかどうかを簡単に確認できます。これにより潜在的に巨大なプロジェクトが単純なプロジェクトに変わった回数や、開発作業で節約した時間を数えることはできません。

比較的マイナーなもう1つのメリットは、自己結合を行うときにテーブルエイリアスを使用するだけでよいことです。

SELECT cust_id, cust_name, addr_street, addr_city, addr_state
    FROM customer
        INNER JOIN address ON addr_cust_id = cust_id
    WHERE cust_name LIKE 'J%';

1
そうすればもうできませんreliably find every line of code that touches a particular column...それがポイントではないですか?
raveren

6
@Raveren-まだできます。「SELECT *」のみを実行する場合、クエリはこの目的には関係ありません。後で/後で、そのクエリの結果を使用する場合は、列名を使用してデータを処理する必要があるため、SQLステートメントではなく、コード内でこの点を考慮する必要があります。
グレンジャー

SELECT *が必要な状況について知りたいと思いますか?私は確かに誰もがプロダクションコードでそれを使用することを望みません。はい、それはアドホッククエリや、複数の結合クエリの結果が奇妙になっているデータの一部を見つけるのに役立ちますが、本番用コードで必要な場所はないと考えることができます。
HLGEM 2013

2
アプリ全体を非OO言語でコーディングしているのでない限り、適切なORMレイヤーがあると、この議論は冗長になります。
アダム

6
したがって、この回答のために、大規模なプロジェクトでテーブルプレフィックスを使用することを決定し、報告することを考えました。テーブルのリファクタリングが非常に簡単になりました。しかし、予想以上に苦痛でした。データベースには複雑な名前付きテーブルがたくさんありました。CustがCustomerのプレフィックスであることを覚えるのは簡単ですが、HazardVerificationMethodのプレフィックスを覚えるのは簡単ではありません。テーブルまたはフィールドを作成するたびに、プレフィックスについて考えるために一時停止する必要がありました。結局、スピードと利便性は検索性よりも重要だと思いましたが、それは貴重な体験だと感じました。
ダリン

15

これらについての私の意見は次のとおりです。

1)いいえ、テーブル名は単数形でなければなりません。

単純な選択(select * from Orders)には意味があるように見えますが、オブジェクト指向の同等物(Orders x = new Orders)にはあまり意味がありません。

DBのテーブルは、実際にはそのエンティティのセットです。set-logicを使用すると、より理にかなっています。

select Orders.*
from Orders inner join Products
    on Orders.Key = Products.Key

最後の行、結合の実際のロジックは、複数のテーブル名と混同しているように見えます。

(Mattが示唆するように)常にエイリアスを使用することでそれが明らかになるかどうかはわかりません。

2)1つのプロパティのみを保持するため、それらは単一である必要があります

3)決して、列名があいまいな場合(上記のように両方に[Key]と呼ばれる列がある場合)、テーブルの名前(またはそのエイリアス)で十分に区別できます。クエリをすばやく入力してシンプルにしたい-プレフィックスは不要な複雑さを追加します。

4)あなたが望むものは何でも、私はCapitalCaseを提案します

これらについて絶対的なガイドラインが1セットあるとは思いません。

選択したものがアプリケーションまたはDB全体で一貫している限り、それは本当に重要だとは思いません。


3
一体何CapitalCaseですか?
ViRuSTriNiTy 2016年

@ViRuSTriNiTy彼がおそらく意味したことpascal case
marctrem 2017

キース、#3で私は両方を行いますが、一貫性はありません(ただし、余談です)が、テーブル、テーブル、変数など
ジョニー

@johnnyそれは悪くはない、それだけで必要ない。なぜ入力する必要のないものを入力するのですか?また、ほとんどのインテリセンス主にあなたが持っているそうであれば、名前の開始を使用してProduct.ProductNameProduct.ProductIDProduct.ProductPriceなどタイピングProduct.Pあなたのすべての接頭辞のフィールドを提供します。
キース

13

私の考えでは:

  1. テーブル名は複数にする必要があります。
  2. 列名は単数である必要があります。
  3. 番号。
  4. テーブル名と列名の両方について、CamelCase(私の好み)またはunderscore_separatedのいずれか。

ただし、これまでに説明したように、どの慣習も、何もしないよりはましです。どのように選択した場合でも、将来の変更が同じ規則に従うように文書化してください。


1
#4に関しては、PascalCase ... camelCase ... snake_case ...
Andrew

11

これらの各質問に対する最良の答えは、あなたとあなたのチームによって与えられると思います。命名規則を持つことは、命名規則がいかに正確であるかよりもはるかに重要です。

これに対する正しい答えはないので、少し時間をかけて(ただし、それほど多くはありません)、独自の規則を選択し、ここで重要な部分を守ってください。

もちろん、標準に関するいくつかの情報を求めることは良いことです。それはあなたが求めていることですが、あなたが得るかもしれないさまざまな答えの数について心配したり心配したりしないでください。あなたにとってより良いと思われる答えを選んでください。

念のため、ここに私の答えがあります:

  1. はい。テーブルはレコード教師俳優のグループなので、複数形です。
  2. はい。
  3. 私はそれらを使用しません。
  4. 私がより頻繁に使用するデータベース-Firebird-はすべてを大文字で保持するため、問題ではありません。とにかく、プログラミングするときは、releaseYearのように、読みやすい方法で名前を書きます。

11
  1. 人ではなくテーブル名を必ず1つにしてください
    1. こっちも一緒
    2. いいえ、私はいくつかの恐ろしいプレフィックスを見てきました。扱っているのはテーブル(tbl_)またはユーザーストアプロシージャ(usp_)であると述べているところまでです。この後にデータベース名が続きます...しないでください!
    3. はい。私はすべてのテーブル名をPascalCaseする傾向があります

28
ああ、神様。番号。テーブル名は複数形です。コレクションです。それには複数のものが含まれています。「select * from PEOPLE」。あなたは一人から選ぶのではなく、複数の人から選ぶのです!
Triynko 2010

4
selectステートメントが複数形である場合に、より良い音が聞こえる方法を常に気に入っています。SELECT id,name FROM contacts WHERE email_address LIKE '%gmail%'表は複数、列は単数。繰り返しますが、常に個人的な意見の問題です。
scunliffe

プレフィックスtbl、qryなどは、データベースメタデータを処理する場合に非常に役立ちます。すばやく簡単な命名規則を持つデータベースのオブジェクトを調べる場合、理解を劇的にスピードアップできます
Cruachan

9

命名規則により、開発チームはプロジェクトの中心にある発見可能性と保守容易性を設計できます。

良い命名規則は進化するのに時間がかかりますが、それが整ったら、チームは共通の言語で前進することができます。良い命名規則は、プロジェクトとともに有機的に成長します。優れた命名規則は、ソフトウェアライフサイクルの最も長く、最も重要なフェーズ、つまり本番環境でのサービス管理における変化に簡単に対処します。

これが私の答えです:

  1. はい。テーブル名は、たとえば一連のトレード証券、またはカウンターパーティを指す場合、複数形にする必要があります。
  2. はい。
  3. はい。SQLテーブルにはプレフィックスtb_、ビューにはプレフィックスvw_、ストアドプロシージャにはプレフィックスusp_、トリガーにはプレフィックスtg_の後にデータベース名が続きます。
  4. 列名は、アンダースコアで区切られた小文字でなければなりません。

名前の付け方は難しいですが、すべての組織で名前を付けることができる人がいます。すべてのソフトウェアチームで、名前付けの標準に責任を持ちsec_idsec_value、およびsecurity_idなどの名前付けの問題がプロジェクト組み込まれる前に確実に解決されるようにする必要があります。 。

それで、良い命名規則と標準の基本的な信条は何ですか?-

  • クライアントの言語とソリューションドメインを使用する
  • 説明的であること
  • 一貫している
  • 明確化、反映、リファクタリング
  • 誰にでも明らかな場合を除き、略語は使用しないでください
  • SQL予約キーワードを列名として使用しないでください

3
テーブルは、定義による関係です。実際には単数です。接頭辞は吸う。テーブルをビューに、またはその逆に変更する必要がありましたか?接頭辞を付けて試してください。それがビューまたはテーブルである場合、どのような違いがありますか?
ウィリアムジョーンズ

接頭辞は、関数やストアドプロシージャなど、2つのオブジェクトに同じ名前を付ける場合に役立ちます。「GetApproverList」という名前の関数があり、同じ名前でこの関数を内部的に呼び出すストアドプロシージャを作成したいと思います。SQLでは、同じ名前の2つのオブジェクトを作成できません。
Ravinder Singh


7
SELECT 
   UserID, FirstName, MiddleInitial, LastName
FROM Users
ORDER BY LastName

2
使用されている標準に注意してください。テーブルには複数のものが含まれ、ユーザーには1つの名、大文字のT-SQLキーワード、Pascalのテーブル定義があります。
Ian Boyd

3
typo:するLastname必要がありますLastName
aminimalanimal

1
テーブル名は単数形にする必要があります。つまり、ユーザーではなくユーザー
AZ_

また、テーブル名が複数であることに注意してください。ユーザーではなくユーザーを保持するため。
Ian Boyd

5

テーブル名はオブジェクトのセットを表すため、常に単数形にする必要があります。あなたが羊のグループを指定するために群れを言うように、または群れは鳥のグループを指定します。複数である必要はありません。テーブル名が2つの名前の組み合わせであり、命名規則が複数である場合、複数の名前が最初の単語であるか2番目の単語であるか、またはその両方であるかがわかりにくくなります。それは論理です。objects.instanceではなく、Object.instanceです。または、TableNames.column(s)ではなく、TableName.column。Microsoft SQLは大文字と小文字を区別しません。大文字を使用すると、2つ以上の名前で構成されるテーブルまたは列の名前を分離して、テーブル名を読みやすくなります。


2
群れは羊のグループです。A Userはユーザーのグループではありません
EricRobertBrewer 2017

4

テーブル名:単数であるオブジェクトではなく、実世界のオブジェクトを表す単一のエンティティであるため、単数である必要があります。

列名:単数である必要があり、それが原子値を保持し、正規化理論を裏付けることを伝えます。ただし、同じタイプのプロパティがn個ある場合は、1、2、...、nなどの接尾辞を付ける必要があります。

テーブル/列のプレフィックス:これは大きなトピックです。後で説明します。

ケース:キャメルケースである必要があります

私の友人、パトリックカーチャー、私はあなたが書いたように、誰かに不快になる可能性のあるものは書かないでくださいようお願いします。これを行う。"。私は友人のパトリックにこの間違いをしたことは一度もありませんが、一般的に書いています。彼らが一緒にこれのためにあなたを倒すつもりならどうしますか?:)


2
それであなたはテーブルが実体であると言っていますか?または、テーブルの行がエンティティですか?私にとって、テーブルは行のコレクションです-したがって、複数を意味するエンティティのコレクションです。
Jason

4

パーティーには遅刻しましたが、列のプレフィックスについて2セント追加したかったのです。

列名自体がデータベース全体で一意であるという事実に基づいて、列のtable_column(またはtableColumn)命名標準を使用するための2つの主要な引数があるようです。

1)クエリで常にテーブル名や列エイリアスを指定する必要はありません

2)列名のコード全体を簡単に検索できます

どちらの主張にも欠陥があると思います。接頭辞を使用せずに両方の問題を解決するのは簡単です。これが私の提案です:

SQLでは常にテーブル名を使用してください。たとえば、常にcolumnではなくtable.columnを使用します。

これは明らかに2)を解決します。table_columnではなくtable.columnを検索するだけです。

しかし、私はあなたが悲鳴を上げるのを聞くことができます、それはどのように解決します1)?それはまさにこれを回避することでした。はい、そうでしたが、ソリューションにはひどく欠陥がありました。どうして?さて、プレフィックスソリューションは次の
ようになります。あいまいな場合にtable.columnを指定する必要をなくすには、すべての列にtable_columnという名前を付けます。
ただし、これは、今後、常に列を指定するたびに列名を記述する必要があることを意味します。しかし、とにかくそれを行う必要がある場合、常に明示的にtable.columnを作成するよりもどのような利点がありますか?正確には、メリットはありません。入力する文字数とまったく同じです。

編集:はい、私は列にプレフィックスを付けると正しい使用法が適用されることを知っていますが、私のアプローチはプログラマーに依存しています


1
あなたが述べたように、table.columnを持つすべてのケースに依存することはできません。プログラマーは1か所で忘れてしまい、グローバルな検索と置換がプログラム全体を壊してしまいます。または、それをルールにして、誰かがテーブルのエイリアスを使用してルールを満たしていると考え、グローバル検索を無効にすることもできます。さらに、ある種のデータベースクラス(優れたプログラマーであればそうする)を使用してコードを整理したい場合は、列名をdb関数に渡すか、列名だけを含める場合があります。変数。
ダリン

2
@janb:私はあなたの答えを完全にサポートします。また、テキスト検索を使用して依存関係を見つけることは、コードをナビゲートする野蛮な方法であることも追加したいと思います。人々がその野蛮な検索慣行を取り除くと、彼らはtable.columnという適切なネーミングを使い始めるでしょう。したがって、問題は命名スタイルではなく、問題は野蛮人のために作られた悪いツールです。
alpav 2015

あなたの主張には欠陥があります。それの問題は、それが両方の方法で機能し、何の利点も追加しないことです。これを解決するには、すでにtable_columnを作成しているため、常にtable.columnを作成するだけです。まあ、すでにtable.columnを書いているので、単にtable_columnと書くこともできます。言い換えれば、それは可能性のあるエラーを紹介していない他のよりも、あなたの答えの間に違いはありません施行規則を。これが、「プライベート」キーワードがある理由です。プログラマーがクラス変数を常に正しく使用することを信頼できますが、キーワードはそれを強制し、考えられるエラーを排除します。
ダリン

3

必須のデータベース命名規則(およびスタイル)(詳細については、ここをクリックしてください)

テーブル名は、短く明確な名前を選択し、1つまたは2つの単語を使用してテーブルを区別することにより、一意のフィールド名の命名が容易になります。また、ルックアップテーブルとリンクテーブルは、テーブルを単数形にし、複数形にすることはできません(更新:与えられた理由に同意この規則では、ほとんどの人は複数のテーブル名が本当に好きなので、私のスタンスを和らげました)...上記のリンクに従ってください


1
ただし、オラクルが提案しているのは、上記のリンクとはまったく反対です。オラクルの発言を
ora/


Oracleの命名規則は、それらすべてのおかしなました.. e.g. PATIENTS would have a primary key called pa_patient_id_pk
nawfal 2013年

2

テーブル名は単数です。たとえば、誰かとその住所の間の関係をモデル化していたとしましょう。たとえば、データモデルを読んでいる場合は、「各人が0、1、または多くの住所に住んでいる可能性がある」ことを好みます。または「各人は0、1、または多くの住所に住んでいる可能性があります。」人を人として言い換えるよりも、住所を複数形にする方が簡単だと思います。さらに、集合名詞は、単数形とはかなり異なることがよくあります。


-4

--Example SQL

CREATE TABLE D001_Students
(
    StudentID INTEGER CONSTRAINT nnD001_STID NOT NULL,
    ChristianName NVARCHAR(255) CONSTRAINT nnD001_CHNA NOT NULL,
    Surname NVARCHAR(255) CONSTRAINT nnD001_SURN NOT NULL,
    CONSTRAINT pkD001 PRIMARY KEY(StudentID)
);

CREATE INDEX idxD001_STID on D001_Students;

CREATE TABLE D002_Classes
(
    ClassID INTEGER CONSTRAINT nnD002_CLID NOT NULL,
    StudentID INTEGER CONSTRAINT nnD002_STID NOT NULL,
    ClassName NVARCHAR(255) CONSTRAINT nnD002_CLNA NOT NULL,
    CONSTRAINT pkD001 PRIMARY KEY(ClassID, StudentID),
    CONSTRAINT fkD001_STID FOREIGN KEY(StudentID) 
        REFERENCES D001_Students(StudentID)
);

CREATE INDEX idxD002_CLID on D002_Classes;

CREATE VIEW V001_StudentClasses
(
    SELECT
        D001.ChristianName,
        D001.Surname,
        D002.ClassName
    FROM
        D001_Students D001
            INNER JOIN
        D002_Classes D002
            ON
        D001.StudentID = D002.StudentID
);

これらは私が教えられた慣習ですが、開発用ホースが使用するものなら何にでも適応する必要があります。

  1. 複数。エンティティのコレクションです。
  2. はい。属性は、エンティティの特異なプロパティの表現です。
  3. はい、プレフィックステーブル名を使用すると、すべての制約インデックスとテーブルエイリアスの名前を簡単に追跡できます。
  4. テーブル名と列名のパスカルケース、インデックスと制約のプレフィックス+ ALLキャップ。

6
ChristianName ...それは奇妙な規則です。
BobbyShaftoe 2009

3
テーブルのシリアル番号?誰かがこれが開発者にとって意味のある仕事であると真剣に考えているのですか?
ErikE 2011年

この例で取り上げたので...テーブルや列の名前の頭字語を大文字にすることには個人的に反対しています。したがって、この場合、StudentIDはStudentIDよりも望ましいと言えます。頭字語が最後にあるときは大した問題ではありませんが、頭字語が名前のフロントまたはミドルにあるという職務で無数の例を見てきました。例:StudentABCSSN対StudentAbcSsn。
redOctober13
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.