我有一个包含用户的数据库,一个有问题的数据库。我要确保每个用户只能回答一次每个问题。
我想到了一个数据库,其中所有问题ID都作为列,而所有用户ID都作为记录,但是当问题和用户数量增加时,这个数据库将变得非常大(而且速度很慢)。
还有另一种方法可以实现更好的性能吗?
您可能需要这样的设置。
Questions table (QuestionID Primary Key, QuestionText) Users table (UserID Primary Key, Username) Answers table (QuestionID, UserID, Date) -- plus AnswerText/Score/Etc as needed.
在该Answers表中的两个第一列一起形成复合主键(QuestionID, UserID)和两者都是外键Question(QuestionID)和Users(UserID)分别。
Answers
(QuestionID, UserID)
Question(QuestionID)
Users(UserID)
复合主键可确保的每个组合QuestionID/UserID仅被允许一次。如果要允许用户多次回答相同的问题,可以扩展篓复合主键以包括日期(然后将其作为复合键)。
QuestionID/UserID
这是规范化的设计,应该足够有效。通常使用代理主键(例如AnswerID)代替复合键,并使用unique约束来确保唯一性- 代理键的使用通常是出于易用性,但这并不是必须的。
AnswerID
unique