数据库规范化和表结构

标准化是一个术语,用于描述如何将文件分解为多个表以创建数据库。 涉及3或4个主要步骤,称为1NF(第一范式),2NF(第二范式),3NF(第三范式)和BCNF(Boyce-Codd范式)。 还有其他一些,但很少使用。 如果数据库位于3NF中(最好是位于BCNF中),则称该数据库已归一化。 这些步骤描述如下:

注意: 使用属性时,我们所说的是表 1NF中 的一个字段

将数据库放入1N

  • 确保所有属性(列)都是原子的(这意味着任何单个字段都应仅具有一个事物的值)。
例子:

在数据库中,关于客户的表将具有地址属性。 地址由公司名称,地址行1,地址行2,地址行3,城市,邮政编码组成。 此地址有6个值,因此每个值都应具有自己的字段(列)。

如果您的公司出售家具,则产品上的桌子可能具有描述属性。 例如,如果该属性为“ Beech Desk 120w x 75h x 50d”。 理想情况下,可以将其分解为多个属性,例如“颜色”,“类型”,“宽度”,“高度”和“深度”。 这样做的原因是,您可以为所有书桌,所有Beech家具,所有宽度为120等的书桌搜索数据库。

  • 为每组相关数据创建一个单独的表,并使用主键标识每组相关数据
例:

在一般的发票数据库中,您将有一个单独的表,分别用于客户,订单,产品,发票,并且可能还需要用于OrderDetails和InvoiceDetails的表。 这些表中的每一个都必须具有自己的主键。 除客户外,这些表中的每个表都具有对另一个表的主键的外键引用。 (

参见下面的关系
  • 不要在单个表中使用多个字段来存储相似的数据
例:

带下划线的字段是“主键”,带斜线的字段是“外键”

在客户订单中,您可能有多个产品。 那是客户订购了多个物品。 如果您尝试将所有内容都放在{

OrderIDCustomerID ,OrderDate,Product1,Product2,Product3}如果客户订购了3种以上的产品,将会发生什么。 查询客户订购的产品的种类或数量也将产生影响。 因此,这些产品字段不属于订单表,这就是为什么我们会有一个OrderDetails表的原因,该表具有对Orders表{ OrderDetailsIDOrderIDProductID ,Quantity}的外键引用。 使用productID作为产品表的外键意味着您不必在此处标识产品属性。 这也使您可以输入订购产品的数量图。 关系:

所有表应具有1对1或1对多的关系。 例如,这意味着1个客户可以拥有1个或很多订单,而1个订单可以有1个或很多细节。

因此,Orders表将具有对Customer表主键{ OrderIDCustomerID ,OrderDate}的外键引用,而OrderDetails表将具有对Order表主键{ OrderDetailsIDOrderIDProductID ,Quantity}的外键引用。 该表还包含对Products表的外键引用。 由于产品可能不止一次订购,因此OrderDetails和Products表之间存在多对一的关系。

如果任何表之间存在多对多关系,则必须使用JOIN表对此进行细分。 例如,客户可以有许多供应商,而供应商可以向许多客户供应。 这被称为多对多关系。 您将需要创建一个JOIN表,该表具有一个主键,该主键由对客户表的外键引用和对供应商表的外键引用组成。 因此,SuppliersPerCustomer表将为{ SupplierIDCustomerID }。 现在,Suppliers表将与SuppliersPerCustomer表具有一对多关系,而Customers表也将与SuppliersPerCustomer表具有一对多关系。 2NF

数据库必须满足1NF的所有要求。

另外,记录不应该依赖于表的主键(主键可以由多个字段组成,只有在绝对必要时才可以使用,例如在JOIN表中)。

例:

客户表既需要客户地址,也需要订单和发票表。 与其将客户的地址作为单独的条目存储在每个表中,不如将其存储在“客户”表或单独的“地址”表中的一个位置。

3NF

数据库必须满足1NF和2NF的所有要求。

第三种标准形式要求关系表中的所有列仅取决于主键。 一个更正式的定义是:

  • 如果关系表已经是2NF,并且每个非键列都不可传递地依赖于其主键,则该关系表为第三范式(3NF)。
换句话说,所有非键属性在功能上仅取决于主键。 所有3NF的真正含义是所有字段(属性)都应依赖于表的主键。 如果不是,则应将它们放在自己的表中。 这意味着每个属性(除非它是主键或外键)都必须直接依赖于此表的主键而不是其他列。 例:

客户表包含诸如地址,城市,邮政编码之类的信息,假设它还包含一个称为运费的列。 运输成本的价值随产品交付到哪个城市而变化,因此,即使每个客户的成本可能不会改变,运输成本的价值也不直接取决于客户,而是取决于客户所在的城市。因此,我们需要创建另一个单独的表来保存有关城市和运输成本的信息。

BCNF

如果每个行列式都是候选键,则关系采用Boyce-Codd范式(BCNF)。 BCNF与3NF非常相似,但是处理主键中的依赖性。 用简单的术语BCNF只是说没有一个主键由多个字段组成,除非它是一个分散多对多关系的联接表,并且只包含它要联接的表的两个主键。

3NF中的大多数关系也在BCNF中。 当表中的主键由多个字段组成并且其他列不依赖于两个字段而是仅依赖于一个字段时,只会发生3NF中的关系不在BCNF中的情况。

如果数据库位于3NF和/或BCNF中,则认为该数据库已规范化。 注意:

有人问为什么标准化很重要。 我们的专家之一斯科特·普赖斯(Scott Price)在此发表了非常有用的回复

发布#15

From: https://bytes.com/topic/access/insights/585228-database-normalization-table-structures

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值