Database design 我的数据正常化了吗?

Database design 我的数据正常化了吗?,database-design,normalization,Database Design,Normalization,我正在制作一个简单的测验数据库,其中一个问题有一个答案和一个或多个图像文件,属于一个子主题,而这个子主题又属于一个主题。此外,每组可能属于三个级别中的一个 以下是我设置数据库的方式: QUESTION ------------------- question_id pk question varchar answer varchar subtopic_id foreign_key MEDIA ------------------- media_id p

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

以下是我设置数据库的方式:

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)
我的数据库设计正确吗?如果没有,我怎样才能做得更好

编辑:我希望显示一个问题(和一张图片,如果有的话),并将用户的答案与正确答案进行比较。我需要主题和副标题,以显示适当的问题

编辑2:添加了你的建议

Edit3:更新的数据库描述。

请看这个图表:

一些注意事项:

  • 级别可以具有唯一性(主题1和主题3)和 共享(主题2)主题
  • 一个主题可以有一个或多个 子主题,但子主题不能 属于多个主题
  • 子主题可以有一个或多个 问题,但问题属于你 只有一个子主题。两个问题(问题2和问题3)可能有相同的子主题和主题,但其级别可能不同。尽管主题(主题2)和子主题(子主题2和3)可能属于多个级别(级别1和2),但有些子主题只包含级别1的问题,而其他子主题包含级别2(子主题3)的问题(问题4)
  • 一个问题只能有一个答案 而这个答案不可能属于我们 另一个问题
  • 答案(或它的问题)可以 有一个可选的图像文件,并且 该图像文件可用于其他应用程序 问题
  • 谢谢

  • 您应该在id的表后命名id,例如问题id、媒体id等(在它们的主键位置,也就是说,不只是当它们用作外键时)。这使得连接更容易,因为您可以使用(问题id)从问题连接媒体中说
  • 问题表缺少子主题id
  • 您可能想用level_id替换level,在level表上有一个外键,但这不是一个硬性规定,只是一个建议。它更灵活,但也更多的工作;它最终归结为什么对你的问题领域有意义

  • 除了那些次要的勘误表,我觉得还可以。

    因为问题属于子主题,所以问题表应该有一个子主题id的外键。

    当然,这是标准化的,并且根据您的要求看起来还可以。但是,您可能已经在问题表中删除了
    子主题id

    好问题,在构建应用程序之前提出这个问题,这充分说明了您学习和提高数据建模技能的能力

    您的模型的限制

    这是简单意义上的标准化:你已经决定了实体是什么;你需要什么样的关系;您甚至认为它们是无意义的东西,没有识别特征,并且您将标识列作为物理键提供给它们。然后,您已将表格标准化

    这与关系模型或规范化无关

    这是典型的应用思考(可以理解,因为这就是你所拥有的一切,你知道功能需求)。但这与数据无关。如果你从这个角度创建它,你不会得到一个数据库,你会得到一个应用程序的存储位置。现在,如果这个应用程序是为一个测验编写的,然后扔掉,那是可以接受的。但是如果测验要进行一两个月;如果该公司在十年后仍然存在;如果测验数量增加;如果要运行的统计数据将增长、改进和成熟。。。你会有很多问题。每次你增强应用程序时,你都必须替换它的“数据库”。在某个时候,他们会认为应用程序(以及其中包含的“数据库”)太昂贵而无法更改,并放弃这两个应用程序

    即使在应用程序存在的短时间内,由于数据收集没有标准化,它也非常有限,RM的“威力”也会丢失给您,而RM是在每个商业RDBMS中实现的。导航(无论如何都很麻烦,因为SQL连接很麻烦)甚至更麻烦。要从一个孩子那里得到一个祖父母,你必须得到父母,即使你没有从中得到任何专栏。用户只能通过应用程序访问数据,应用程序处于“关闭”状态。如今,有成千上万的报表工具连接到数据库,允许用户执行各种查询,而不必等待应用程序团队实施更改请求,这些查询还没有被您识别出来:这种功能已经丧失。每年左右,您必须“重新考虑”数据堆

    游牧化

    规范化产生开放数据库,允许无限制地访问

    数据的寿命比应用程序长得多。它在应用程序中幸存下来,并对组织有价值。当应用程序被替换时,他们将提取数据,并希望替换应用程序准备好加载数据。如果他们没有使用数据建模器,新的应用程序设计师就不会从旧的应用程序设计师的错误中吸取任何教训,整个过程也会重复

    好的,所以该组织预计明年成立。好的,那么您将在生产中运行多个测验。好的,那么你已经雇了一个数据建模师来查看你收集的数据,这样你就不会犯那些错误了。杰出的谢谢你。我接受

    关系建模203

    数据建模:(a)完全独立于应用程序和您可能知道的任何功能;(b)使用应用程序开发人员不知道的完全不同的技术。让我们开始吧。这不是一个正式的课程重新规范化(这将花费太长时间,理论将让你厌烦至死);这只不过是在建模者工作时从他的肩膀上看过去。你所需要做的就是回答问题