我有一个应用程序,可以收集有关学校,团队和玩家的数据。 可以有学校,团队和球员级别的定制问题。
我已经提出了2个数据库设计,在我走这条路之前,我只对每个设计的优缺点感兴趣。
设计1
这个设计有一个单独的表格。数据库设计似乎很明确,但我希望在代码中会有很多复制来支持基本相同的3组表。
表:
SchoolQuestions (id, questiontext, length, is_required)
SchoolAnswers(id, school_id, school_question_id, answer)
TeamQuestions (id, questiontext, length, is_required)
TeamAnswers(id, team_id, team_question_id, answer)
PlayerQuestions (id, questiontext, length, is_required)
PlayerAnswers(id, player_id, player_question_id, answer)
设计2
此设计将所有内容存储在2个表格中。
Questions.type字段是ENUM('SCHOOL', 'PLAYER', 'TEAM')
在Answers表中,只有schoold_id,team_id或player_id中的一个不能为空。
这似乎是最简单的解决方案,但确实有冗余列,所以看起来有点混乱
表:
Questions (id, type, questiontext, length, is_required)
Answers(id, school_id, team_id, player_id, question_id, answer)
如果您有更好的解决方案,我们非常感谢您提供任何反馈,或建议改进设计。
答案 0 :(得分:3)
设计2肯定更好。
同样对于字段type
,您可能想要创建一个单独的表,该表将有3行,并将Question表的外键添加到此Type表中。
设计1会遇到很多问题:
[编辑]错过了player_id,team_id和school_id列。
您可以创建所有者表,该表将具有引用类型表的所有者类型(学校,团队,玩家)。这样,Answers表中只有一个OwnerId列。
答案 1 :(得分:1)
我喜欢第二个。
由于您知道该类型,因此您还可以删除三个ID列,并将其替换为一个通用ID列。
这样,您可以在不更改数据库的情况下为培训师或家长添加问题。
编辑:......和其他人建议的那样,为Type添加一个表。
答案 2 :(得分:0)
我个人更喜欢Design2。 但我的意见是,为QuestionType设置一个单独的表,并在Questions中有一个外键,以引用问题的特定问题类型。 只是帮助将它分开一点。 其次,我想,我不是数据库中ENUM类型的忠实粉丝。
只是我最初的想法。
祝你好运。答案 3 :(得分:0)
绝对设计-2更好。但我认为你可以从答案表中删除school_id,team_id,player_id字段,因为你在那里有question_id。使用question_id,您可以将问题表的答案联系起来。那就是我的初学者的想法。如果我错了,请纠正..