首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >规范化如何修复三种类型的更新异常?

规范化如何修复三种类型的更新异常?
EN

Database Administration用户
提问于 2018-01-04 15:31:55
回答 2查看 22K关注 0票数 7

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

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

我还理解三个更新异常:

  • 插入异常
  • 缺失异常
  • 更新/修改异常

我现在很难理解的是如何将两者联系在一起。例如,哪种不同的形式帮助(S)修复插入异常?其他异常情况也是如此。理想情况下,我想知道两组之间的映射关系,以及为什么这些形式修复了某些异常。

这是我在这里的第一个问题,我在谷歌和这个网站上搜索,试图先找到答案,但没有结果。

谢谢。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2018-01-04 16:05:30

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

  1. 插入异常:如果有一个包含“类”和“学生”数据的大enrollment表(在其他地方都不存在),那么如果没有至少一个相应的学生,就不能输入新的(空的)课程(因为该表是注册情况的记录)。因此,应用2NF并为classesstudents创建单独的表,并将原始的enrollment表链接到ClassID和StudentID。现在您可以进入没有学生的新班级和没有班级的新学生。
  2. 删除异常:与上面相同,如果原始enrollment表的每一行包含学生的全部详细信息和他们注册的班级的全部详细信息,那么删除类的最后一个注册学生将删除该类的最后一部分信息。解决方案是相同的,应用2NF创建单独的表,这样学生就可以注册或不注册,而不会丢失课堂信息。
  3. 更新异常:与上面一样,使用单表方法,更新有多名学生的班级的信息(例如,房间号)可能会导致一些行是新的信息,而其他行则是旧的。如前所述,应用2NF也是解决方案,因此类数据只在一个地方( classes表)被更改。

请注意,1NF在您的过程中仍然起着一定的作用,因为它意味着您不能尝试通过将整个注册学生列表塞进单个字段,或者添加student1student2student3字段或诸如此类的内容来解决问题。

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

我发现一些有用的资源:

票数 7
EN

Database Administration用户

发布于 2018-01-04 17:20:10

我会拿出我学过的例子。1Nf全部是将重复组分离成不同的表,它的所有属性都应该是原子的。

让我们假设我们有一个包含以下属性的表。Purchase_order_No,Purchase_date,Emp_code,Supplier_Name,Supplier_No,Part_No Part_description,Part_Quantity

  • 1NF:在这里,在一个单一的采购订单中,我们可能订购了几个部件,因此相关的相同数据将被重复。因此,我们可以将part_no、part_description、part_quantity分开,并将part_no、purchase_order_no作为主键。但这里会有异常现象..。
    1. 插入异常:因为现在有两个表。我们不能插入一个没有购买的零件。
    2. 删除异常:如果为某一特定部分进行了一次采购,如果该订单被删除,那么我们的表中根本就不会有该部分。
    3. 更新异常:为了改变对某一部分的描述,我们需要在所有购买的地方更新它。

  • 2NF:对于一个表来说,它的所有属性都应该完全依赖于它的主键。例如,要知道零件数量,我们需要知道零件编号和采购订单。但是对于零件描述,第no部分就足够了,所以我们把它们分成表。供应商名称不包括d
    1. 插入异常:如果我们必须插入一个没有订单的供应商,那么这是不可能的。
    2. 删除异常:如果删除供应商的最后一个订单,供应商的数据也会丢失。
    3. 更新异常:要更新供应商,需要更新供应商的每一个采购订单。

  • 3Nf:对于表在3NF中,不应该有属性也依赖于另一个非键属性。在这里,我们有供应商的名称,这也是依赖于sup-不,所以我们把他们放在一个不同的表。其中sup_no是主键。

现在,表不能进一步分解,但异常可以继续存在。我们不能形成完全规范化的数据表。希望这能让你清醒。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/194631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档