データベースを設計するときはいつでも、データベース内の項目に名前を付ける最良の方法があるかどうかを常に考えています。かなり頻繁に、私は次の質問を自問します。
- テーブル名は複数形にするべきですか?
- 列名は単数形にする必要がありますか?
- テーブルまたは列にプレフィックスを付ける必要がありますか?
- アイテムの命名には大文字と小文字を使用する必要がありますか?
データベース内の項目に名前を付けるための推奨ガイドラインはありますか?
データベースを設計するときはいつでも、データベース内の項目に名前を付ける最良の方法があるかどうかを常に考えています。かなり頻繁に、私は次の質問を自問します。
データベース内の項目に名前を付けるための推奨ガイドラインはありますか?
MicrosoftのSQLServerサンプルデータベースを確認することをお勧めします: https ://github.com/Microsoft/sql-server-samples/releases/tag/adventureworks
AdventureWorksサンプルでは、データベースオブジェクトの編成にスキーマ名を使用する、非常に明確で一貫性のある命名規則を使用しています。
ここで遅い回答ですが、要するに:
詳細:
(1)しなければならないこと。毎回特定の方法で行わなければならない ことはほとんどありませんが、いくつかあります。
(2)おそらくあなたがすべきこと。
(3)考慮すべきこと。
わかりました、私たちは意見を検討しているので:
テーブル名は複数形であるべきだと思います。テーブルは、エンティティのコレクション (テーブル) です。各行は 1 つのエンティティを表し、表はコレクションを表します。したがって、Person エンティティのテーブルを People (または Person など、好きなように) と呼びます。
クエリで単数形の「エンティティ名」を見たい人のために、テーブル エイリアスを使用します。
SELECT person.Name
FROM People person
LINQ の「from person in people select person.Name」に少し似ています。
2、3、4 については、@Lars に同意します。
私は3つのDBAを持つデータベースサポートチームで働いており、検討されているオプションは次のとおりです。
テーブルには単数形の名前を使用します。テーブルには、システムの名前(またはその頭字語)が接頭辞として付けられる傾向があります。これは、プレフィックスを変更してテーブルを論理的にグループ化できるため、システムが複雑な場合に役立ちます(つまり、reg_customer、reg_booking、およびregadmin_limits)。
フィールドの場合、フィールド名にはテーブルのプレフィックス/ acryonm(つまり、cust_address1)が含まれていると予想されます。また、標準のサフィックスのセット(PKの場合は_id、「コード」の場合は_cd、「name」の場合は_nm)を使用することをお勧めします。 "、" number "の場合は_nb、" Date "の場合は_dt)。
Foriegnキーフィールドの名前は、Primaryキーフィールドと同じである必要があります。
すなわち
SELECT cust_nm, cust_add1, booking_dt
FROM reg_customer
INNER JOIN reg_booking
ON reg_customer.cust_id = reg_booking.cust_id
新しいプロジェクトを開発するときは、優先するエンティティ名、プレフィックス、頭字語をすべて書き留めて、このドキュメントを開発者に提供することをお勧めします。次に、新しいテーブルを作成することを決定したときに、テーブルとフィールドの名前を「推測」するのではなく、ドキュメントを参照できます。
Ok。それは私の $0.02 です
表が複数形であるかどうかは個人の好みの問題であり、ベスト プラクティスなどないという議論をよく耳にします。DBA とは対照的に、特にプログラマーとしてはそうではないと思います。私が知る限り、テーブル名を複数形にする正当な理由は、「オブジェクトのコレクションなので意味がある」以外にありませんが、テーブル名を単数形にすることでコードに正当な利点があります。例えば:
複数のあいまいさによって引き起こされるバグや間違いを回避します。プログラマーはスペリングの専門家として正確には知られていないため、いくつかの単語を複数形にすることは混乱を招きます。たとえば、複数形の単語は 'es' で終わりますか、それとも 's' だけで終わりますか? それは人ですか、それとも人ですか?大規模なチームでプロジェクトに取り組む場合、これが問題になる可能性があります。たとえば、チーム メンバーが作成したテーブルを複数形にするために間違った方法を使用した場合などです。このテーブルを操作する頃には、アクセスできないコードや修正に時間がかかりすぎるコードで使用されています。その結果、テーブルを使用するたびにスペルを間違えることを覚えておく必要があります。これと非常によく似たことが私に起こりました。チームのすべてのメンバーが一貫して簡単に正確に使用できるようにすればするほど、エラーなしでテーブル名を修正したり、常にテーブル名を検索したりする必要がなければ、より良い結果が得られます。単一バージョンは、チーム環境での処理がはるかに簡単です。
テーブル名の単数形を使用し、主キーにテーブル名のプレフィックスを付けると、コードだけで主キーからテーブル名を簡単に決定したり、その逆を行うことができるという利点があります。テーブル名を含む変数を指定し、「Id」を最後に連結すると、追加のクエリを実行することなく、コードを介してテーブルの主キーを取得できます。または、主キーの末尾から「Id」を切り取って、コードでテーブル名を決定することもできます。主キーのテーブル名なしで「id」を使用すると、コードを介して主キーからテーブル名を特定することはできません。さらに、テーブル名を複数形にし、PK 列の前にテーブル名を付けるほとんどの人は、PK でテーブル名の単数バージョンを使用します (たとえば、statuses や status_id)。
テーブル名を単数形にすると、テーブルが表すクラス名と一致させることができます。繰り返しになりますが、これによりコードが簡素化され、テーブル名だけを使用してクラスをインスタンス化するなど、非常に巧妙なことを行うことができます。また、コードの一貫性が向上するため、...
テーブル名を単数形にすると、命名スキームが一貫性があり、整理され、すべての場所で保守しやすくなります。コード内のすべてのインスタンスで、それが列名であろうと、クラス名であろうと、テーブル名であろうと、まったく同じ名前であることがわかっています。これにより、グローバル検索を実行して、データが使用されているすべての場所を確認できます。テーブル名を複数形にする場合、そのテーブル名の単数バージョンを使用する場合があります (主キーでは、クラスになります)。データが複数形と呼ばれるインスタンスと単数形と呼ばれるインスタンスを持たないことは理にかなっています。
要約すると、テーブル名を複数形にすると、コードをよりスマートで扱いやすくする上でのあらゆる種類の利点が失われます。テーブル名を回避できたオブジェクトまたはローカルコード名に変換するために、ルックアップテーブル/配列が必要になる場合さえあるかもしれません。単数形のテーブル名は、最初は少し奇妙に感じるかもしれませんが、複数形の名前よりも大きな利点があり、ベスト プラクティスだと思います。
また、ISO/IEC 11179 スタイルの命名規則にも賛成です。命名規則は規範的ではなくガイドラインであることに注意してください。
ウィキペディアのデータ要素名を参照してください。
「テーブルはエンティティのコレクションであり、コレクションの命名ガイドラインに従います。理想的には、集合名を使用します。たとえば、Personnel です。複数形も正しいです: Employees。正しくない名前には、Employee、tblEmployee、および EmployeeTable が含まれます。」
いつものように、ルールには例外があります。たとえば、常に 1 行しかないテーブルは、構成テーブルなどの単数形の名前の方が適している場合があります。そして、一貫性が最も重要です。買い物に規則があるかどうかを確認し、ある場合はそれに従います。それが気に入らない場合は、孤独なレンジャーになるのではなく、ビジネスケースを変更して変更してください.
私たちの好み:
テーブル名は複数形にするべきですか?
一度もない。コレクションであることの引数は理にかなっていますが、テーブルに何が含まれるかはわかりません (0、1、または多数のアイテム)。複数の規則があると、命名が不必要に複雑になります。1 つの家、2 つの家、マウス対マウス、人対人、そして私たちは他の言語を見ていません。
Update person set property = 'value'
テーブル内の各人に作用します。
Select * from person where person.name = 'Greg'
person 行のコレクション/行セットを返します。
列名は単数形にする必要がありますか?
通常、はい、正規化ルールに違反している場合を除きます。
テーブルまたは列にプレフィックスを付ける必要がありますか?
主にプラットフォームの好み。列にテーブル名のプレフィックスを付けることをお勧めします。テーブルのプレフィックスは付けませんが、ビュー (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
...少し(!)長めです。
アイテムの命名には大文字と小文字を使用する必要がありますか? はい - 小文字 :)、アンダースコア付き。これらは非常に読みやすく、クロスプラットフォームです。上記の 3 と合わせても意味があります。
ただし、これらのほとんどは好みです。- 一貫性がある限り、誰が読んでも予測できるはずです。
ISO 11179-5をご覧ください:命名と識別の原則ここで入手できます:http://metadata-standards.org/11179/#11179-5
しばらく前にここでブログを書きました:ISO-11179命名規則
私はこれがゲームに遅れていることを知っており、質問はすでに非常によく答えられていますが、列名のプレフィックスに関する#3について意見を述べたいと思います.
すべての列には、それらが定義されているテーブルに固有のプレフィックスを付けて名前を付ける必要があります。
たとえば、テーブル "customer" と "address" が与えられた場合、それぞれ "cust" と "addr" のプレフィックスを使用してみましょう。「customer」には、「cust_id」、「cust_name」などが含まれます。「アドレス」には、「addr_id」、「addr_cust_id」(顧客への外部キー)、「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) いいえ、テーブル名は単数形にする必要があります。
単純な選択 ( select * from Orders
) には意味があるように見えますが、オブジェクト指向の等価物 ( Orders x = new Orders
) にはあまり意味がありません。
DB 内のテーブルは、実際にはそのエンティティのセットです。set-logic を使用すると、より理にかなっています。
select Orders.*
from Orders inner join Products
on Orders.Key = Products.Key
結合の実際のロジックである最後の行は、複数のテーブル名で混乱しているように見えます。
(マットが示唆するように)常にエイリアスを使用することでそれが解消されるかどうかはわかりません。
2) 1 つのプロパティのみを保持するため、特異である必要があります。
3) 列名があいまいな場合 (上記のように、両方に [Key] という列がある場合)、テーブルの名前 (またはそのエイリアス) でそれらを十分に区別できません。クエリをすばやく入力してシンプルにしたい - 接頭辞を使用すると、不要な複雑さが増します。
4) あなたが望むものは何でも、CapitalCase をお勧めします
これらのいずれについても、絶対的なガイドラインはないと思います。
あなたが選んだものがアプリケーションやDB全体で一貫している限り、それは本当に重要ではないと思います.
私の意見では:
しかし、それが言及されたように、どんな慣習も慣習がないよりはましです。どのように選択しても、将来の変更が同じ規則に従うように文書化してください。
これらの質問のそれぞれに対する最良の答えは、あなたとあなたのチームによって与えられると思います. 命名規則がどれほど正確であるかよりも、命名規則を持つことがはるかに重要です。
それに対する正しい答えはないので、少し時間をかけて (ただし、あまり時間をかけて) 独自の規則を選択し、-ここが重要な部分です-それを固守する必要があります。
もちろん、それに関する標準に関する情報を求めるのは良いことですが、それはあなたが求めていることですが、得られるさまざまな回答の数について心配したり心配したりしないでください。あなたにとってより良いと思われるものを選択してください.
念のため、ここに私の答えがあります:
命名規則により、開発チームはプロジェクトの中心にある発見可能性と保守性を設計できます。
優れた命名規則は進化するのに時間がかかりますが、それが実施されると、チームは共通の言語で前進することができます。優れた命名規則は、プロジェクトとともに有機的に成長します。優れた命名規則は、ソフトウェアライフサイクルの最も長く最も重要なフェーズである本番環境でのサービス管理中の変更に簡単に対処します。
これが私の答えです:
ネーミングは難しいですが、すべての組織には名前を付けることができる人がいます。すべてのソフトウェアチームには、ネーミング標準に責任を持ち、 sec_id、sec_value、security_idなどのネーミングの問題がプロジェクトに組み込まれる前に早期に解決されるようにする必要があります。 。
それで、良い命名規則と標準の基本的な信条は何ですか:-
SELECT
UserID, FirstName, MiddleInitial, LastName
FROM Users
ORDER BY LastName
いくつかの選択肢を提供するリンクを次に示します。部分的に定義された仕様に依存するのではなく、従うことができる単純な仕様を探していました。
テーブル名は一連のオブジェクトを表すため、常に単数形にする必要があります。群れとは羊の群れを指し、群れは鳥の群れを指します。複数形は必要ありません。テーブル名が 2 つの名前の合成であり、命名規則が複数形の場合、複数形の名前が最初の単語か 2 番目の単語か、またはその両方であるかを判断するのが難しくなります。それはロジックです。objects.instance ではなく、Object.instance です。または、TableNames.column(s) ではなく、TableName.column です。Microsoft SQL では大文字と小文字が区別されません。テーブル名が 2 つ以上の名前で構成されている場合にテーブル名または列名を区切るために大文字を使用すると、テーブル名が読みやすくなります。
パーティーに非常に遅れましたが、それでも列プレフィックスについて2セントを追加したかった
列のtable_column(またはtableColumn)命名基準を使用することには、2つの主な議論があるようです。どちらも、列名自体がデータベース全体で一意であるという事実に基づいています。
1)クエリでテーブル名や列エイリアスを常に指定する必要はありません
2)コード全体で列名を簡単に検索できます
私は両方の議論に欠陥があると思います。プレフィックスを使用せずに両方の問題を解決するのは簡単です。これが私の提案です:
SQLでは常にテーブル名を使用してください。たとえば、常にcolumnではなくtable.columnを使用します。
table_columnの代わりにtable.columnを検索できるようになったため、明らかに2)が解決されます。
しかし、私はあなたが悲鳴を上げるのを聞くことができます、それはどのように解決しますか1)?それはまさにこれを回避することでした。はい、そうでしたが、解決策はひどく欠陥がありました。なんで?プレフィックスソリューションは、次の
ように要約されます。あいまいな場合にtable.columnを指定する必要がないように、すべての列にtable_columnという名前を付けます。
ただし、これは、今後、列を指定するたびに常に列名を書き込む必要があることを意味します。しかし、とにかくそれをしなければならない場合、常に明示的にtable.columnを書くことよりも利点は何ですか?正確には、利点はありません。入力する文字数はまったく同じです。
編集:はい、接頭辞を付けて列に名前を付けると正しい使用法が適用されることを認識していますが、私のアプローチはプログラマーに依存しています
基本的なデータベースの命名規則 (およびスタイル) (詳細については、ここをクリックしてください)
テーブル名は短くてあいまいでない名前を選択し、1 つまたは 2 つ以上の単語を使用しないでテーブルを区別します 一意のフィールド名の命名を容易にするだけでなく、ルックアップ テーブルとリンク テーブルはテーブルに複数形ではなく単数形の名前を付けます (更新: 与えられた理由に同意しますただし、ほとんどの人は複数のテーブル名が本当に好きなので、私のスタンスを和らげました)...上記のリンクをたどってください
テーブル名単数形。誰かとその住所の間の関係をモデル化しているとしましょう。たとえば、データモデルを読んでいる場合、「各人が 0,1 または複数の住所に住んでいる可能性がある」ことを好むでしょうか。または「各人は、0、1、または複数の住所に住んでいる可能性があります。」人を人として言い換えるよりも、住所を複数形にする方が簡単だと思います。さらに、集合名詞は単数形とはかなり異なる場合があります。
--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
);
これらは私が教えられた慣習ですが、開発ホースが使用するものは何でも適応する必要があります。