次要关系的唯一性约束

时间:2017-05-12 10:52:01

标签: mysql database database-design

我试图建模一个简单的民意调查系统,我有4个表

Election
 id, title, description

Candidate
 id, electionId, name

User
 id, (other user details)...

Vote
 userId, candidateId

选举与候选人之间存在1-n关系。如果有人参加多次选举,他们将被列为多个候选人。

我无法确定如何在数据库级别的每次选举中将每个用户限制为一票。如果我在electionId中创建Vote列,则会创建不一致或冗余的数据,但我无法想到以其他方式约束数据。

我觉得这必须是一个常见的问题,但我不知道该怎么称呼它所以我的后半个小时的搜索没有成果。这里有什么正确的方法?

2 个答案:

答案 0 :(得分:1)

您可以使用当前架构执行此操作,方法是在插入Vote之前添加验证(在mysql中,这是在插入TRIGGER之前完成的)。您将选择该特定用户的所有投票,并与candidateId上的候选人一起加入,并确保没有一个electionIds与投票所针对的候选人的选举ID相匹配。

这完全正常化但价格昂贵。有时为了性能而添加冗余字段是值得的。我将在此模式中将electionId添加到Vote,以便插入不需要如此昂贵的验证。

答案 1 :(得分:1)

您可以将Candidate的PK更改为electionId, name的合并,或者至少使该组合成为Candidate中的唯一约束。

然后,您将Vote更改为userId, electionId, name,其中PK为userId, electionId且有一个FK指向Candidate' s electionId, name这是独一无二的。

这意味着userId和electionId对于投票表是唯一的,并且没有剩余的冗余。