数据库结构反馈

时间:2011-06-28 04:27:18

标签: sql sql-server database database-design

我有一个应用程序,可以收集有关学校,团队和玩家的数据。 可以有学校,团队和球员级别的定制问题。

我已经提出了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)

如果您有更好的解决方案,我们非常感谢您提供任何反馈,或建议改进设计。

4 个答案:

答案 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,您可以将问题表的答案联系起来。那就是我的初学者的想法。如果我错了,请纠正..