余計な設計はお勧めできません。つまり、不要な場合は常に主キーを自動インクリメントすることはお勧めできません。
不要な例を見てみましょう。
記事用のテーブルがあります。これには、int主キーid
、およびという名前のvarchar列がありtitle
ます。
また、記事のカテゴリでいっぱいのテーブルがありますid
。int主キーvarchar name
です。
Articlesテーブルの1行にはid
、5とtitle
「ガチョウをバターで調理する方法」があります。その記事をCategoriesテーブルの次の行にリンクします: "Fowl"(id:20)、 "Goose"(id:12)、 "Cooking"(id:2)、 "Butter"(id:9) 。
これで、記事とカテゴリの2つのテーブルができました。2つの間の関係はどのように作成しますか?
id(主キー)、article_id(外部キー)、category_id(外部キー)の3つの列を持つテーブルを作成できます。しかし、今は次のようなものがあります:
| id | a_id | c_id |
| 1 | 5 | 20 |
| 2 | 5 | 12 |
| 3 | 5 | 2 |
より良い解決策は、2つの列で構成される主キーを持つことです。
| a_id | c_id |
| 5 | 20 |
| 5 | 12 |
| 5 | 2 |
これは以下を行うことで実現できます。
create table articles_categories (
article_id bigint,
category_id bigint,
primary key (article_id, category_id)
) engine=InnoDB;
自動インクリメント整数を使用しないもう1つの理由は、主キーにUUIDを使用している場合です。
UUIDは定義上一意であり、一意の整数を使用した場合と同じことを実現します。また、整数に対して独自の追加の利点(および短所)もあります。たとえば、UUIDを使用すると、参照している一意の文字列が特定のデータレコードを指していることがわかります。これは、1つの中央データベースがない場合、またはアプリケーションがデータレコードをオフラインで作成する機能を備えている場合(後でデータベースにアップロードする場合)に便利です。
最終的に、主キーを物事として考える必要はありません。それらを実行する機能と考える必要があります。なぜ主キーが必要なのですか?将来変更されないフィールドを使用して、テーブルから特定のデータセットを一意に識別できるようにするため。id
これを行うために呼び出される特定の列が必要ですか、それとも他の(不変の)データに基づいてこの一意の識別を行うことができますか?