我有一个用户数据库,一个有问题数据库。我要确保每个用户只能回答一次每个问题。

我想到了一个数据库,其中所有问题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)的外键。

复合主键可确保每个QuestionID/UserID组合仅被允许一次。如果要允许用户多次回答同一问题,则可以扩展“复合主键”以包括日期(然后将其作为复合键)。

这是规范化的设计,应该足够有效。通常使用surrogate primary key(如AnswerID)代替复合键,并使用unique约束来确保唯一性-代理键的使用通常是出于易用性,但这绝不是必要。

10-08 02:48