我的数据是否正常化?

时间:2010-10-31 04:18:24

标签: database-design normalization

我正在制作一个简单的测验数据库,其中一个问题有一个答案和一个或多个图像文件,属于一个子主题,而该子主题又属于一个主题。此外,每个小组可能属于三个级别之一。

这就是我设置数据库的方式:

QUESTION
-------------------
question_id      pk
question    varchar
answer      varchar
subtopic_id foreign_key

MEDIA
-------------------
media_id         pk
file_name   varchar
question_id foreign_key


SUBTOPIC
-------------------
subtopic_id      pk
subtopic    varchar
topic_id    foreign_key


TOPIC
-------------------
topic_id         pk
topic       varchar
level       choices(1,2,3)

我的数据库设计得当吗?如果没有,我怎样才能做得更好?

编辑:我希望显示一个问题(和图像,如果存在),并将用户的答案与正确答案进行比较。我需要主题和子主题才能显示正确的问题。

Edit2:添加了您的建议。

编辑3:更新了数据库说明。

请查看此图表:diagram

有些说明:

  1. 级别可以同时具有唯一性(主题1和3)和 共享(主题2)主题。
  2. 主题可以有一个或多个 副主题,但副主题不能 属于不止一个主题。
  3. 子主题可以有一个或多个 问题,但问题属于 只有一个副主题。两个问题(问题2和3)可能具有相同的子主题和主题,但它们的级别可能不同。虽然,主题(主题2)和副主题(子主题2和3)可能属于许多级别(级别1和级别2),但是某些子主题仅包含级别1的问题,而其他子主题包含级别2的问题(问题4)(子主题3)
  4. 一个问题只能有一个答案 那个答案不属于 另一个问题。
  5. 答案(或者它的问题)可以 有一个可选的图像文件,和 该图像文件可以在其他中使用 的问题。
  6. 感谢。

5 个答案:

答案 0 :(得分:15)

答案 1 :(得分:3)

由于问题属于子主题,因此问题表应具有子主题id的外键

答案 2 :(得分:3)

当然,这是标准化的,并且根据您的要求看起来很好。但是,您可能已将subtopic_id停在问题表上。

答案 3 :(得分:2)

  1. 你应该在他们的表之后命名id,例如,question_id,media_id等。(在他们的主键位置,也就是说,不仅仅是当它们被用作外键时。)这使得连接变得更容易,因为你可以说出来比如FROM question JOIN MEDIA USING (question_id))。
  2. 问题表缺少subtopic_id。
  3. 你可能想用level_id替换level,在LEVEL表上有一个外键,但这不是一个硬性规则,只是一个建议。它更灵活,但也更多的工作;它最终归结为对你的问题领域有意义的东西。
  4. 除了那些小错误之外,它对我来说很好。

答案 4 :(得分:0)

对命名约定的建议:

主键:someNameId 外键:someOtherName_Id

目前在几张桌子中你有media_id和question_id。如果不看数据结构,目前还不清楚是什么。现在假设每个表中有80个表和20到40个属性。你会迷失在外键的哪里,哪里是主键。

相关问题