无法确定规范化还是非规范化是否有效

时间:2016-10-24 05:55:40

标签: mysql database-design

这个问题可能有点宽泛!

最近我正在学习MySQL。我正在建立一个学校考试信息数据库。我创建了一个名为 subjects 的表格,其中存储了有关各种主题的信息,包括每个主题的全名或满分。我还创建了另一个名为 exams 的表格,其中存储了每个学生在每个科目上获得的分数。显然subjects是主表,exams是子表。根据存储在这两个表格中的数据,当连接在一起时,会生成每个学生的百分比和成绩等信息。

但是,如果subjects表中的某些信息将来发生变化,那该怎么办呢?对于特定主题,请更改满分。在这种情况下,exams表中的旧记录将无效或错误,因为现在联接将生成对于当前记录正确但对旧记录错误的新值。

在这种情况下我该怎么办?我是否将两个表都归一化为一个完整的表格?但我在数据库设计方面的胆怯知识说这是错误的做法!

任何帮助或见解都将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

您可以向subjects - 表添加新行,而不是在主题发生更改时更改现有行。因此,主题表包含主题的版本。这可以与使用有效日期结合使用。应用该方法后,您将需要一个标准化步骤。这可能是其中一条评论的含义。

答案 1 :(得分:0)

您需要模拟您的历史情况,就像您对当前情况进行建模一样。

您可能会也可能不会选择对过去的数据进行反规范化。但是,每次努力的最大好处实际上涉及使历史情况表看起来像或实际上是当前情况表。这包括投入进一步将当前行标准化为子行,然后按日期扩展,以便您可以将同一日期的子行连接在一起。

如果重复数据成为已证明的负担,那么您可以将表拆分为多个表,对于您希望将最近更改的日期划分为多个,而其他子类在较早的更改时保持日期。然后,您可以加入在给定日期之前同意的最新行。在一些“时间”数据库中,我们通过将行拆分为子行来最小化冗余数据,而不仅仅是约会它们,而是用它们当前的日期范围标记它们。

来自a recent answer of mine

  

硬删除建议假设您保留所需的历史数据。不要将你的想法限制为仅仅归零FK,级联,将标志/日期列添加到现存表或其他任何内容。正确模拟礼物和礼物过去包括在每个选定的应用程序情况发生变化时需要作为DBMS事务发生的数据库更改。软删除的提议只涉及将某些当前和历史数据放入同一个表中而不是不同的表中。这仅适用于非常简单的电流和电流模型。历史情况。

     

通常可以直接为当前应用程序情况设计数据库。但如果我们关心过去,我们通常只会关心其中的一部分。如果是这样,当某些应用情况从当前变为过去时,我们可以将相关当前状态的快照复制到历史状态。使用软删除标记与日期标记数据是未注明日期和过时的历史数据的组合表版本,我们只关心当前与过去的情况,我们只关心与发生更改时的对比。

     

“时间”数据库或多或少地记录了当前的情况和一堆过时的现状。使用当前数据的结构记录过去的数据简化了理解和查询当前&过去的数据。 (查询时态数据库可以促进的时间间隔可能变得非常复杂。)但事实证明,制作给定当前数据设计的时间版本不仅涉及将日期列添加到现有的当前数据表。它需要重新构建当前数据,将其分解为具有更多约束的较小表。这是因为不同类型的应用情况变化需要约会现有当前数据设计的不同列组合。 (硬和软历史快照设计必须解决这个问题,但对于有限的过去/历史。)