复合主键与单主键和唯一索引

时间:2014-03-14 14:26:48

标签: mysql composite-primary-key indices primary-key-design

我正在为具有以下实体的投票系统建模:

  • 类别
  • 提名

顾名思义,我将在各自的表格中存储类别和被提名者。投票将分为两个阶段。在第一阶段,每个类别将有8名被提名者。被评选最多的4位候选人将进入第二阶段(也是最后阶段)。

到目前为止,我有这种结构(简化)

category
    id      PK
    name

nominee
    id      PK
    name

phase
    id      PK
    name

我的问题是如何为投票部分建模。我认为我有两个选择,但我不确定哪一个更好或每个的优缺点是什么:


选项1:拥有一个带有复合3列主键的category_nominee表(我非常确定"规范"这里的PK是由这3个字段构成的;不确定性能影响;我使用的是mysql)

category_nominee
    category_id         PK
    nominee_id          PK
    phase_id            PK

我不喜欢这样的是,要从投票表中引用category_nomine,我将不得不再次使用这3列,因为我没有'在category_nominee中有一个标识符。因此,在投票表格中,我必须重复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_nomine。我还不确定哪个选项更方便。

SQL Fiddle for option 1

SQL Fiddle for option 2

1 个答案:

答案 0 :(得分:1)

根据我对数据建模的了解,选项1是不错的选择。也许这就是外键存在的原因。从未见过选项2.

但是在你的选项1中,category_nominee和vote是重复的。实现这样的东西:

category
    id      PK
    name

nominee
    id      PK
    name

phase
    id      PK
    name

vote
    (category_id         FK
     nominee_id          FK 
     phase_id            FK) PK
    //others fields required or not

如果您想在所有表中使用唯一的列名,则无法阻止您重命名(category_nominee。)category_id字段。您只需将此列作为外键链接到origin列。