2017-06-08 18 views
1

MySQLを使用する電子商取引のWebサイトのデータベースを設計しています。私は必要なテーブルとそのテーブルに必要なすべてのフィールドのリストを作成しました。私は合計9つのテーブルを持っています。すべてのテーブルでIDを主キーとして自動インクリメントする

私が行ったことは、すべてのテーブルのプライマリキーとして自動インクリメントIDを含めることです。

2以外のすべてのテーブルは3NFに正規化されています。 2つのテーブル 'ユーザー'と 'アウトレット'は2NFに正規化されません。

私は、プライマリキーとして自動インクリメントIDを使用すると、正規化が面倒であることに気付きました。正規化は厳密には必要ではないので、すべてのテーブルでプライマリキーとして自動インクリメントIDを使用することには何らかの欠点があるかどうかを知りたいですか?

+2

ブリッジテーブル(つまり、多対多関係を表すために使用されるテーブル)上の自動インクリメントIDは有用ではありません。あなたがそのような種類のテーブルを持っているなら、あなたはそれらを避けるべきです。 – Renzo

+0

もっと便利な答えはこちら [テーブルの主キーの練習](https:// stackoverflow。com/questions/337503/whats-the-best-for-primary-keys-in-tables)[専用プライマリキーフィールド](https://stackoverflow.com/questions/166750/should-i-have-a -adicated-primary-key-field)[特定のプレフィックスとオートナンバー](https://stackoverflow.com/questions/506164/use-item-specific-prefixes-and-autonumber-for-primary-keys) – Haswin

+0

ここで非常に良い答えは、 [テーブルの主キーのベストプラクティス](https://stackoverflow.com/questions/337503/whats-the-best-practice-for-primary-keys-in-tables) [専用のプライマリキーフィールド](https://stackoverflow.com/questions/166750/should-i-have-a-dedicated-primary-key-field) – Haswin

答えて

1

私は私の時間にテーブルの多くを作成しました。私はそのうちの1/3だけAUTO_INCREMENTを使用しました。残りは「完全に良い」自然な「PK」のように見えたので、私はそのように行った。

"ノーマルフォーム"は、あなたを始めるための教科書的な方法です。実生活(私の意見では)では、後にNFがパフォーマンスやその他の考慮事項に後ろを向いています。

InnoDBテーブルの場合、実際にPRIMARY KEY(auto_incまたはnaturalのいずれか)を明示的に指定する必要があります。レンゾが指摘するように、多くのマッピングテーブル、と私はここで議論している:

auto_incが物事を遅く、一般的なパターンが多くあるhttp://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table InnoDB内で

PRIMARY KEYは、データを(クラスタ化)が格納され、したがって、索引構造(BTree)は事実上余分なスペースを占有しません。各二次索引は、暗黙的にPK列を含む別個のBTreeを占有する。

1

すべてのテーブルでプライマリキーとして自動インクリメントIDを使用するとよいです。これにより、データの自動インデックス作成に役立ちます。 ORM(例としてDoctrine2)を計画している場合は、各テーブルにプライマリキーが必要です。

+0

すべてのテーブルで自動インクリメントキーを使用するには* ORM *が必要ですか?私はそれを奨励することを知っていますが、自然キーと複合キーも許可しないORMはわかりません。それはかなり限定的な枠組みになるでしょう。 –

+0

私はリプレイで言及したように、Doctrine2は各エンティティでアイデンティティを好みます。データベースからエンティティを生成する場合、doctrine2にはidentityカラムが必要です。 –

+0

Doctrine 2.1は複合主キーをサポートしており、自動インクリメントキーは必要ありません。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html –

1

あなたの質問はMySQL用にタグ付けされているので、MySQLのInnoDBストレージエンジンはすべてのテーブルのクラスタ化インデックスとして主キーを使用することを指摘します。

可能であれば、クラスタ化インデックスでクエリを実行する方が効率的です。しかし、プライマリキーとして機能することができる別の列または列のセットがあっても、すべてのテーブルで自動インクリメントのプライマリキーを使用する必要があり、常に自動ではなくそれらの列で検索するクエリを実行する任意のルールがある場合-incrementカラムを使用すると、クラスタ化インデックスによるクエリの利点は得られません。

関連する問題