admin

具有限制的多对多关系的数据库设计

sql

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

我想到了一个数据库,其中所有问题ID都作为列,而所有用户ID都作为记录,但是当问题和用户数量增加时,这个数据库将变得非常大(而且速度很慢)。

还有另一种方法可以实现更好的性能吗?


阅读 170

收藏
2021-06-07

共1个答案

admin

您可能需要这样的设置。

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仅被允许一次。如果要允许用户多次回答相同的问题,可以扩展篓复合主键以包括日期(然后将其作为复合键)。

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

2021-06-07