我试图建模一个简单的民意调查系统,我有4个表
Election
id, title, description
Candidate
id, electionId, name
User
id, (other user details)...
Vote
userId, candidateId
选举与候选人之间存在1-n关系。如果有人参加多次选举,他们将被列为多个候选人。
我无法确定如何在数据库级别的每次选举中将每个用户限制为一票。如果我在electionId
中创建Vote
列,则会创建不一致或冗余的数据,但我无法想到以其他方式约束数据。
我觉得这必须是一个常见的问题,但我不知道该怎么称呼它所以我的后半个小时的搜索没有成果。这里有什么正确的方法?
答案 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对于投票表是唯一的,并且没有剩余的冗余。