标准化是一个术语,用于描述如何将文件分解为多个表以创建数据库。 涉及3或4个主要步骤,称为1NF(第一范式),2NF(第二范式),3NF(第三范式)和BCNF(Boyce-Codd范式)。 还有其他一些,但很少使用。 如果数据库位于3NF中(最好是位于BCNF中),则称该数据库已归一化。 这些步骤描述如下:
注意: 使用属性时,我们所说的是表 1NF中 的一个字段将数据库放入1N
- 确保所有属性(列)都是原子的(这意味着任何单个字段都应仅具有一个事物的值)。
如果您的公司出售家具,则产品上的桌子可能具有描述属性。 例如,如果该属性为“ Beech Desk 120w x 75h x 50d”。 理想情况下,可以将其分解为多个属性,例如“颜色”,“类型”,“宽度”,“高度”和“深度”。 这样做的原因是,您可以为所有书桌,所有Beech家具,所有宽度为120等的书桌搜索数据库。
- 为每组相关数据创建一个单独的表,并使用主键标识每组相关数据
在一般的发票数据库中,您将有一个单独的表,分别用于客户,订单,产品,发票,并且可能还需要用于OrderDetails和InvoiceDetails的表。 这些表中的每一个都必须具有自己的主键。 除客户外,这些表中的每个表都具有对另一个表的主键的外键引用。 (
参见下面的关系 )- 不要在单个表中使用多个字段来存储相似的数据
(
带下划线的字段是“主键”,带斜线的字段是“外键” )在客户订单中,您可能有多个产品。 那是客户订购了多个物品。 如果您尝试将所有内容都放在{
OrderID , CustomerID ,OrderDate,Product1,Product2,Product3}如果客户订购了3种以上的产品,将会发生什么。 查询客户订购的产品的种类或数量也将产生影响。 因此,这些产品字段不属于订单表,这就是为什么我们会有一个OrderDetails表的原因,该表具有对Orders表{ OrderDetailsID , OrderID , ProductID ,Quantity}的外键引用。 使用productID作为产品表的外键意味着您不必在此处标识产品属性。 这也使您可以输入订购产品的数量图。 关系:所有表应具有1对1或1对多的关系。 例如,这意味着1个客户可以拥有1个或很多订单,而1个订单可以有1个或很多细节。
数据库必须满足1NF的所有要求。
另外,记录不应该依赖于表的主键(主键可以由多个字段组成,只有在绝对必要时才可以使用,例如在JOIN表中)。
例:客户表既需要客户地址,也需要订单和发票表。 与其将客户的地址作为单独的条目存储在每个表中,不如将其存储在“客户”表或单独的“地址”表中的一个位置。
3NF数据库必须满足1NF和2NF的所有要求。
第三种标准形式要求关系表中的所有列仅取决于主键。 一个更正式的定义是:
- 如果关系表已经是2NF,并且每个非键列都不可传递地依赖于其主键,则该关系表为第三范式(3NF)。
客户表包含诸如地址,城市,邮政编码之类的信息,假设它还包含一个称为运费的列。 运输成本的价值随产品交付到哪个城市而变化,因此,即使每个客户的成本可能不会改变,运输成本的价值也不直接取决于客户,而是取决于客户所在的城市。因此,我们需要创建另一个单独的表来保存有关城市和运输成本的信息。
BCNF如果每个行列式都是候选键,则关系采用Boyce-Codd范式(BCNF)。 BCNF与3NF非常相似,但是处理主键中的依赖性。 用简单的术语BCNF只是说没有一个主键由多个字段组成,除非它是一个分散多对多关系的联接表,并且只包含它要联接的表的两个主键。
3NF中的大多数关系也在BCNF中。 当表中的主键由多个字段组成并且其他列不依赖于两个字段而是仅依赖于一个字段时,只会发生3NF中的关系不在BCNF中的情况。
如果数据库位于3NF和/或BCNF中,则认为该数据库已规范化。 注意:有人问为什么标准化很重要。 我们的专家之一斯科特·普赖斯(Scott Price)在此发表了非常有用的回复
发布#15From: https://bytes.com/topic/access/insights/585228-database-normalization-table-structures