1NF
- 定义:
- 确保每列的原子性.
- 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式.
- 举例:
- 顾客表(姓名、编号、地址、……)其中”地址”列还可以细分为国家、省、市、区等。
2NF
- 定义:
- 在第一范式的基础上更进一层,目标是确保表中的每列都和主键相关.
- 如果一个关系满足第一范式,并且除了主键以外的其它列,都依赖(直接和间接)于该主键,则满足第二范式.
- 举例:
- (订单编号,商品编号,商品名称,数量,单位,价格,客户,所属单位,联系方式)
- 这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,而仅仅是与商品编号相关。所以在这里违反了第二范式的设计原则。
- 所以应该将这个表拆成3个,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中。如下所示:
- (订单编号,客户,所属单位,联系方式)
- (订单编号,商品编号,数量)
- (商品编号,商品名称,单位,价格)
3NF
- 定义:
- 在第二范式的基础上更进一层,目标是确保每列都和主键列直接相关,而不是间接相关.
- 如果一个关系满足第二范式,并且除了主键以外的其它列都不依赖于主键外的列,则满足第三范式.
- 举例:
- (订单编号,订单项目,负责人,客户名称,所属单位,联系方式)
- 这个表中是以订单编号作为主键。而所属单位,联系方式这些是客户的属性,依赖于客户,与主键间接相关,所以不满足3NF.
- 所以应该将这个表拆成2个,把客户信息分离到另一个表中。如下所示:
- (订单编号,订单项目,负责人,客户编号)
- (客户编号,客户名称,所属单位,联系方式)
BCNF 鲍依斯-科得范式
- 定义:
- 在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。
- 举例:
- 假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
- (仓库ID, 存储物品ID) →(管理员ID, 数量)
- (管理员ID, 存储物品ID) → (仓库ID, 数量)
- 所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
- (仓库ID) → (管理员ID)
- (管理员ID) → (仓库ID)
- 即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。
- 假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系: