千家信息网

2.3.1关于规范化

发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,规范化是一个数据设计过程,其高级目标是将每个事实保持在一个位置,以避免数据冗余以及插入,更新和删除异常。有多个级别的规范化,本节将介绍前三个级别。考虑到第三范式(3NF)项是多么基本,只看到如何达到3
千家信息网最后更新 2024年11月22日2.3.1关于规范化

规范化是一个数据设计过程,其高级目标是将每个事实保持在一个位置,以避免数据冗余以及插入,更新和删除异常。有多个级别的规范化,本节将介绍前三个级别。考虑到第三范式(3NF)项是多么基本,只看到如何达到3NF才有意义。

考虑一种跟踪销售情况的情况。您跟踪的核心实体是销售订单,其中每个销售订单包含有关所购买的每个项目的详细信息(称为行项目):其名称,价格,数量等。该订单还包含客户的名称和地址等。有些订单有很多不同的订单项,有些订单只有一个。

在第一范式(1NF)中,没有重复的数据组,也没有重复的行。行和列(字段)的每个交集都只包含一个值,并且没有包含相同事实的列组。为避免重复行,有一个主键。对于销售订单,在第一范式中,不显示表格的单个字段中的每个销售订单的多个行项目。此外,不会有多个列显示订单项。

然后是第二范式(2NF),其中设计是第一范式,每个非键列依赖于完整的主键。因此,订单项会分为销售订单行项目表,其中每行代表一个订单的一个订单项。您可以查看订单项表,并查看所售商品的名称不依赖于订单项表的主键:销售商品是其自己的实体。因此,您将销售项目移动到其自己的表格,显示项目名称。每件商品的价格可能因订单而异(例如,由于折扣),因此这些价格保留在订单项表中。对于销售订单,客户的名称和地址不依赖于销售订单的主键:客户是其自己的实体。从而,

接下来是第三范式,其目标是确保不依赖于非关键属性。因此,目标是获取与行的主题(主键)不直接相关的列,并将它们放在自己的表中。因此,有关客户的详细信息(例如客户名称或客户城市)应放在单独的表中,然后将客户外键添加到订单表中。

2NF表与3NF表的不同之处的另一个例子是网球锦标赛的获胜者表,其中包含锦标赛,年份,获胜者和获胜者出生日期的列。在这种情况下,获胜者的出生日期很容易出现不一致,因为同一个人可能会在不同的记录中显示出生日期。避免这个潜在问题的方法是将桌子分成一个用于比赛获胜者,另一个用于球员出生日期

0