我正在为具有以下实体的投票系统建模:
顾名思义,我将在各自的表格中存储类别和被提名者。投票将分为两个阶段。在第一阶段,每个类别将有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。我还不确定哪个选项更方便。
答案 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列。