标准化如何修复三种类型的更新异常?

the*_*ler 5 normalization database-design relational-theory

我一直在阅读 Connolly 和 Begg 的“数据库系统:设计、实施和管理的实用方法”以了解数据库规范化(第 14 章)。我现在更好地理解了三种数据库规范化形式:

  • 第一范式 (1NF)
  • 第二范式 (2NF)
  • 第三范式 (3NF)

我也了解三个更新异常:

  • 插入异常
  • 删除异常
  • 更新/修改异常

我现在正在努力理解的是如何将两者联系在一起。例如,哪些不同的形式有助于修复插入异常?其他异常也类似。理想情况下,我想知道这两个组之间的映射关系以及为什么这些形式会修复某些异常。

这是我在这里的第一个问题,我在谷歌和这个网站上搜索,试图首先找到答案,但无济于事。

谢谢你。

Bra*_*adC 5

1NF 基本上只是“不要在单个列中保留太多数据”,所以我认为 2NF 和 3NF 是所有 3 个数据库异常的主要修复方法,因为 2NF 和 3NF 都涉及将项目分解到它们自己的表中:

  1. 插入异常:如果你有一个大enrollment表,同时包含“班级”和“学生”数据(这两个数据在别处都不存在),那么你不能在没有至少一个相应学生的情况下进入新的(空)课程(因为表是您的注册记录)。因此,应用 2NF 并为classes、分别创建单独的表,students并使您的原始enrollment表通过 ClassID 和 StudentID 链接到两者。现在您可以进入没有学生的新班级和没有班级的新学生。

  2. 删除异常:与上面相同,如果原始enrollment表的每一行都包含学生的完整详细信息和他们注册的班级的完整详细信息,则删除班级的最后一名注册学生将删除有关该学生的最后一位信息类。解决方法一样,应用2NF制作单独的表,这样学生就可以注册或取消注册,而不会丢失班级信息。

  3. 更新异常:同上,使用单表的方法,更新一个有多个学生的班级的信息(比如房间号)可能会导致一些行是新信息而其他行是旧信息的情况。如上所述应用 2NF 再次是解决方案,因此类数据仅在一个地方(classes表)发生变化。

请注意,1NF在您的过程中仍然发挥着一定的作用,因为这意味着您无法尝试通过将整个注册学生列表塞进一个字段或添加student1student2student3字段或类似内容来解决问题。

我们可以想出类似的例子,其中的因素是 3NF 而不是 2NF:如果每个“学生”都有一个教师顾问(并且一些顾问被分配给多个学生),那可能不是我们学生表的关键部分,但它是“依赖属性”,可能会导致一些与上述相同的问题。因此,教师顾问可以分成自己的表。

我发现一些有用的资源: