MySQLの命名規則はありますか?


162

ここに私がそれをする方法があります:

  1. テーブル名小文字であり、(別の単語に下線を使用し、そして特異あり、例えばfoofoo_bar
  2. 私は通常(常にではない)自動インクリメントPKを持っています。:私は、次の規則を使用tablename_id(例えばfoo_idfoo_bar_idなど)。
  3. テーブルに外部キーである列が含まれている場合は、そのキーの列名を、そのテーブルのテーブルからコピーします。たとえば、テーブルfoo_barにFKがあるとしますfoo_idfoo_idPKはfoo)があるとします。
  4. 参照整合性を適用するためにFKを定義するとき、私は以下を使用しますtablename_fk_columnname(たとえば、追加の例3です)foo_bar_foo_id)。これはテーブル名/列名の組み合わせであるため、データベース内で一意であることが保証されています。
  5. 私はこのように列を並べ替えます:PK、FK、そして残りの列をアルファベット順に並べます

これを行うより良い、より標準的な方法はありますか?


6
自動インクリメントPKに「id」だけを使用するのは間違っていますか?どうして?列の名前は、テーブルのコンテキストでのみ意味があります。したがって、すべてのテーブルに1つの「id」があり、FKのid_ <table_name>が多数ある可能性があります。
Zbyszek 2013年

3
@Zbyszek私はそれに対する最も単純な理由は単に一貫性/単純さのためだと思います。むしろ持つよりid_tableB=> オハイオ州ノー 異なる名前の列 idの一貫性id_tableB=> id_tableBだけですっきり見える...またはOPはそれをしないよう:foo_id=> foo_idではなくfoo_id=>id
ドン・チードル

回答:


106

まず第一に、一貫性を保つことです。

あなたが質問で概説した慣習であなたはほとんどそこにいると思います。しかし、いくつかのコメント:

ポイント1と2は良いと思います。

ポイント3-残念ながら、これは常に可能とは限りません。foo_bar列がfoo_idあり、another_foo_idどちらもfooテーブルfoo_id列を参照する単一のテーブルにどのように対処するかを考えてください。これに対処する方法を検討する必要があります。これはちょっとしたケースですが!

ポイント4-ポイント3に似ています。複数の参照列があることに対応するために、外部キー名の最後に数字を導入することができます。

ポイント5-私はこれを避けます。それはあなたにほとんど何も提供せず、あなたが後日テーブルに列を追加したり削除したいときに頭痛になるでしょう。

その他のポイントは次のとおりです。

インデックスの命名規則

インデックスの命名規則を導入することをお勧めします。これは、実行するデータベースメタデータの作業にとって非常に役立ちます。たとえば、インデックスを呼び出しfoo_bar_idx1たり、foo_idx1完全にアップしますが、価値を考慮に- 。

単数形と複数形の列名

列名だけでなくテーブル名でも、複数形と単数形の厄介な問題に対処することをお勧めします。この主題は、DBコミュニティで大きな議論を引き起こすことがよくあります。テーブル名と列の両方に単数形を使用します。そこ。私はそれを言った。

ここでの主なものはもちろん一貫性です!


ポイント5より優れているものは何ですか?なぜそれが頭痛になるのでしょうか?
ラッシュー、2014年

7
フォローアップするために、私は後でここに来る人のために、このverryが役に立ったと評価:launchbylunch.com/posts/2014/Feb/16/sql-naming-conventions/...
Enissay

1
2つの名前(DocumentChapter、DocumentVersion、DocumentTypeなど)で構成されるモデルのオブジェクトを保持するテーブルに名前を付けるための適切な「スキーム」を見つけるのに苦労しています。DocumentTypeのために例えば、私はそれに名前を付けることができdocumenttypeたりdocument_type。私は後者のほうが好きですが、ほとんどの場合、多対多の関係があり、次のようなテーブルが必要document_document_typeです。これを処理する方法の提案はありますか?
lexith

@ rsb2097 Re:ポイント5-(最後に)1列追加した後、注文が無効になる可能性があります。列の並べ替えが必要な制約を追加しないでください。これは不要なオーバーヘッドです。
シェパード、

21

一貫性は、あらゆる命名標準の鍵です。それが論理的で一貫している限り、あなたはそこに99%います。

標準自体は非常に個人的な好みです。そのため、標準が気に入ったら、それで実行してください。

あなたの質問に完全に答えるために-いいえ、MySQLには推奨される命名規則/標準がないので、独自にロールすることは問題ありません(そしてあなたの論理は論理的に思えます)。



4

ありがたいことに、PHP開発者は、私が知っているいくつかの開発コミュニティのような「ラクダの大物」ではありません。

あなたの慣習はうまく聞こえます。

a)単純で、b)一貫している限り、問題は発生しません:)

PS:個人的には、5)はやりすぎだと思います...


2
RDBMSの一部は大文字と小文字を区別する(またはすべてを大文字に変更する)点で大文字と小文字が区別されないため、キャメルケースは実際に多くのDBコミュニティによって嫌われています。
mal-wan、2011年

@mwan:どのRDBMSを指定できますか?そして、私はキャメルケースのジョッキーです。キャップは、スキーマで1つの目的のみを果たし、結合テーブルを示し、(フィールドの場合)単語の境界を示すため、_は、othertable_id(つまり、テーブル名= othertableおよびそのテーブルのフィールド= id )。その上、他のRDBMSが大文字と小文字を区別しない場合、それは本当に重要なのですか?同じテーブルの大文字と小文字のバージョンを変更するつもりはありません。ああ、私は大文字と小文字を区別しないRDBMSを好みません-一貫したコードを作成したいのです
Samuel Fullman

7
キャメルケースで記述されたMySQLの、:Iキャメルケースと我々が使用する製品の名前を嫌うMySQLユーザの皮肉のような
DBX12

1
@ DBX12これは、キャメルケースではなくパスカルケースですが、あなたの主張はまだ残っています。
MarredCheese

@MarredCheese考えたことはありませんが、あなたは正しいです。camelCaseには最初からこぶがあってはいけません。
DBX12 '25

1

簡単な答え:いいえ

まあ、少なくともOracleやコミュニティが推奨するような命名規則はありません。ただし、基本的には、MySQLのドキュメントに示されているように、識別子のルールと制限に従うことを認識しておく必要があります。https//dev.mysql.com /doc/refman/8.0/en/identifiers.html

あなたが従う命名規則については、私はそれは大丈夫だと思います、5という数字だけは少し不要です、データベースを管理するためのほとんどの視覚的なツールは列名をソートするためのオプションを提供すると思います(私はDBeaverを使用しています)目的がテーブルの見栄えのよい視覚的表現である場合は、このオプションを使用できます。

個人的な経験から、私はこれをお勧めします:

  • 小文字を使用してください。これにより、データベースをあるサーバーから別のサーバーに移行するときの相互運用性がほぼ保証されます。lower_case_table_namesが正しく構成されていないことがあり、単にcamelCaseまたはPascalCase標準(大文字と小文字の区別の問題)を認識しないだけでサーバーがエラーをスローし始めることがあります。
  • 短い名前。シンプルで明確。最も簡単で高速なのは、テーブルまたは列を特定することです。信頼してください。短時間で多くの異なるクエリを実行する場合は、書き込み(および読み取り)をすべて単純にする方が良いでしょう。
  • 接頭辞は避けてください。異なるアプリケーションのテーブルに同じデータベースを使用しているのでない限り、プレフィックスを使用しないでください。これにより、クエリに冗長性が追加されます。これが便利な場合があります。たとえば、主キーと外部キーを識別したい場合、通常はテーブル名がid列のプレフィックスとして使用されます。
  • 単語を区切るにはアンダースコアを使用します。あなたはまだのために使用アンダースコアので、テーブル、列、などに名前を付けるために複数の単語を使用したい場合はseparating_the_words、これは(あなたの目とあなたのストレスを受けた脳はあなたに感謝しようとしている)読みやすくするために役立ちます。
  • 一貫している。独自の基準を作成したら、それに従ってください。ルールを作成し、ルールを破った最初の人にならないでください。それは恥ずべきことです。

そして、「複数形vs単数形」のネーミングはどうですか?まあ、これはほとんど個人的な好みの状況です。私の場合、要素のコレクションまたは要素を含むパッケージとしてテーブルを考えるので、テーブルに複数の名前を使用しようとします。したがって、複数の名前は私にとって意味があります。列の名前は単数です。これは、列をそれらのテーブル要素に対して単数で説明する属性と見なしているためです。

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