次のエンティティを持つ投票システムをモデル化しています。
- カテゴリー
- 候補者
- 段階
名前が示すように、カテゴリと候補者をそれぞれのテーブルに格納します。投票には 2 つのフェーズがあります。第 1 段階では、各カテゴリに 8 名がノミネートされます。最も投票数の多かった 4 人の候補者が第 2 段階 (および最終段階) に進みます。
これまでのところ、私はこの構造を持っています(簡略化)
category
id PK
name
nominee
id PK
name
phase
id PK
name
私の問題は、投票部分をモデル化する方法です。2つのオプションがあると思いますが、どちらが優れているか、それぞれの長所と短所はわかりません。
オプション 1:複合 3 列の主キーを持つ category_nominee テーブルを持つ (ここでの「正規の」PK はこれら 3 つのフィールドによって形成されていると確信しています。パフォーマンスへの影響についてはわかりません。mysql を使用しています)
category_nominee
category_id PK
nominee_id PK
phase_id PK
これについて私が気に入らないのは、category_nominee に単一の識別子がないため、votes テーブルから category_nominee を参照するには、これらの 3 つの列を再度使用する必要があることです。したがって、投票テーブルでは、3 つの列を繰り返す必要があります。
vote
id
category_id FK
nominee_id FK
phase_id FK
さらに、category_id が category.id または category_nominee.category_id を指す必要があるかどうかはわかりません (私は後者に傾いています)。
オプション 2: category_nominee に自動インクリメントされた id 列を作成し、category_id、nominee_id、および phase_id を複合一意キーにします。
category_nominee
id
category_id Unique
nominee_id Unique
phase_id Unique
vote
id PK
category_nominee_id FK
これにより、category_nominee レコードの参照が簡単になり、繰り返しが回避されます。投票には、category_nominee よりもはるかに多くの記録があると予想しています。それでも、どちらのオプションがより便利かはわかりません。