私にはユーザーの役割があります。
ユーザーは複数の役割を持つことができます。というテーブルがありますusers_roles
。
私は3つの列を持っています- id
、、、。user
role
id
自動インクリメント列です。
それで、
id
コードで列を使用することはないので、列を削除することをお勧めしますか?はいの場合、このテーブルのインデックスはどの列にする必要がありますか?それとも、インデックスをまったく持たないようにする必要がありますか?
私にはユーザーの役割があります。
ユーザーは複数の役割を持つことができます。というテーブルがありますusers_roles
。
私は3つの列を持っています- id
、、、。user
role
id
自動インクリメント列です。
それで、
id
コードで列を使用することはないので、列を削除することをお勧めしますか?
はいの場合、このテーブルのインデックスはどの列にする必要がありますか?それとも、インデックスをまったく持たないようにする必要がありますか?
user が userid の場合、id 列は必要ないことに同意します。userid をインデックス付き PK にすることができます。
user がユーザーの名前である場合は、id を保持するか、user_id を作成して、インデックスに有効なキーを取得できるようにする必要があります。
「id」フィールドを削除することを想定している場合、ユーザーと user_roles テーブルの間の関係をどのように作成するか。
主キーを定義することを常にお勧めします。主キーを定義すると、デフォルトの索引が作成されます。そして、それは何らかの形でパフォーマンスを向上させます。
また、外部キーを定義すると、外部キー インデックスも生成されます。したがって、テーブル クエリの実行が高速になります。
これがあなたの最初の答えです: あなたの要件によると、現時点では user_roles テーブルから「id」主キーを削除できます。これは、ユーザーとロールの間の関係テーブルとしてのみ使用されるためです。しかし、ほとんどの PHP フレームワークでは、リレーションシップ テーブルであっても主キーを削除することはお勧めできません。
これが 2 番目の答えです。主キーを削除する場合は、「user」フィールドと「role」フィールドのインデックスをforeignKey インデックスとして維持する必要があります。また、user_roles テーブルから主キーを削除しない場合。次に、「id」、「user」、および「role」フィールドに対して 3 つのインデックスが生成されます。最初のインデックスがプライマリ インデックスになり、残りの 2 つはforeignKey インデックスになります。
テーブルに追加のインデックスを明示的に定義すると、クエリの実行時に余分なオーバーヘッドが発生します。
users_roles
多多リンクテーブルです。
多対多テーブルの主キーには、少なくとも 2 つの一般的な方法があります。
users_roles
ここの場合のように、独自の代理主キーを持っています ( users_roles.id
)単一の主キーが複合キーよりも優れている理由など、単純なキーと複合キーに関する多くの議論があります。
インデックスと主キーは異なる概念であることに注意してください。主キーは一意性のため、インデックスはパフォーマンスのためです。(1 つのテーブルに複数のインデックスを設定できますが、PK は 1 つだけです)
あなたが言っているように、他のテーブルが user_roles を参照していない場合、実際には主キーは必要ありません。
テーブルが大きくなった場合users_roles
、たとえば特定の役割のユーザーを頻繁に検索する場合など、ユーザー列にインデックスを追加したり、場合によってはロール テーブルにもインデックスを追加したりすることがあります。