数据库范式

基本概念

  • 实体
    客观存在并可以被区别的事物。事物可以是看得到、摸得着的,比如一个建筑、一个人;也可以是虚拟的,比如老师与学校之间的关系

  • 属性
    实体的一个特性,称为一个属性。属性是一个逻辑上的概念,比如“性别”是“人”的一个属性。在关系型数据库中,属性是一个物理概念,一个属性对应一列

  • 记录
    表中的一行

  • 分量
    记录的某个属性的值


  • 表中,可以唯一标识一条记录、且其任何真子集都不能再标识的 某个属性或属性组。如果有不止一个,那么都叫做候选键。可以从候选键中选出一个主键

  • 外键
    如果一个属性或属性组不是键,但是它是 别的表的键 ,则称其为外键

  • 主属性
    如果一个属性 出现在了 任意一个 候选键 中,则称其为主属性

  • 非主属性
    如果一个属性 没有 出现在 任何 候选键 中,则称其为非主属性


第一范式-1NF

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


第二范式-2NF

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

  • 一个订单可以包含多个商品
  • 每个商品都有名称和单价

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

  • OrderDetail(OrderId,ProductId)
  • ProductDetail(ProductId,ProductName,ProductUnitPrice)

第三范式-3NF

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

  • OrderId是主键

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

  • Order(OrderId,ConsumerId)
  • Consumer(ConsumerId,ConsumerAdress)

BCNF

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

  • 一个管理员只管理一个仓库,一个仓库只有一个管理员
  • 同一种物品可以存到多个仓库

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

  • 主属性 管理员ID 部分依赖 候选键(仓库ID,存储物品ID)中的 仓库ID
  • 主属性 仓库ID 部分依赖 候选键(管理员ID,存储物品ID)中的 管理员ID

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

  • Storagehouse(仓库ID,存储物品ID,物品数量)
  • StoragehouseMan(管理员ID,仓库ID)

感谢浏览tim chow的作品!

如果您喜欢,可以分享到: 更多

如果您有任何疑问或想要与tim chow进行交流

可点此给tim chow发信

如有问题,也可在下面留言: