基本概念


第一范式-1NF

1NF强调列的原子性,也就是一个列不能拆分成其它的几列。比如,姓名可以是一列,也可以分为姓和名两列,在一张人口统计表中,就需要将姓和名分开。


第二范式-2NF

在1NF的基础上,必须有主键,并消除 非主属性 对 候选键 的 部分依赖
比如,订单详情表OrderDetail(OrderId,ProductId,ProductName,ProductUnitPrice),其中:

那么主键应该是(OrderId,ProductId),但是 非主属性ProductName和ProductUnitPrice只依赖ProductId,而不依赖OrderId,也就是:非主属性并不完全依赖候选键,不符合2NF。此时应该拆成2个表:


第三范式-3NF

在2NF的基础上,消除非主属性 对 候选键 的 传递依赖
比如,订单表Order(OrderId,ConsumerId,ConsumerAddress,OrderState),其中:

ConsumerAdress依赖ConsumerId,ConsumerId依赖OrderId,也就是:非主属性并不直接依赖候选键,不符合3NF。此时,应该拆分成两个表:


BCNF

在3NF的基础上,消除主属性 对 候选键 的 部分依赖 和 传递依赖
比如,仓库表Storagehouse(仓库ID,管理员ID,存储物品ID,物品数量),其中:

所以,候选键是:(仓库ID,存储物品ID)和(管理员ID,存储物品ID),但是:

因此,不满足BCNF。此时,可以拆分成如下两个表: