简单讲解数据库设计三范式

数据的三范式

第一范式(原子性)

数据库表中的每一列都不可以再分,也就是说原子性。例如表中包含一列叫部门岗位 其实可以拆分为部门岗位

第二范式(完整性)

在满足第一范式的基础上要求每个字段都和主键完整相关,而不是仅和主键部分相关(主要针对联合主键而言)完整

例如

订单编号 产品编号 产品价格 产品数量 订单金额 下单时间
ORD0001 PDT527 100 2 680 2019/10/22
ORD0001 PDT578 120 4 680 2019/10/22
ORD0012 PDT579 80 29 8765 2019/11/21
ORD0012 PDT577 77 55 8765 2019/11/21

订单详情表,中的联合主键为产品编号产品编号;但是订单金额下单时间只是与订单编号相关。所以此处的订单详情表不满足第二范式

经过改良拆分为下列两个表订单详情表订单表此时就可以满足第二范式

订单编号 产品编号 产品价格 产品数量
ORD0001 PDT527 100 2
ORD0001 PDT578 120 4
ORD0012 PDT579 80 29
ORD0012 PDT577 77 55
订单编号 订单金额 下单时间
ORD0001 680 2019/10/22
ORD0001 680 2019/10/22
ORD0012 8765 2019/11/21
ORD0012 8765 2019/11/21

第三范式(直接性)

非主键字段和主键字段直接相关,不允许间接相关

员工编号 员工姓名 部门名称 岗位 员工薪资
AU001 萧峰 行政部 助理 10000
AU002 段誉 财务部 出纳 18000
AU003 虚竹 技术部 工程师 12000

上面的问题是 员工编号 -->部门编号–>部门名称,不是直接相关。
应该改为如下两个表的形式

员工编号 员工姓名 部门编号 岗位 员工薪资
AU001 萧峰 CZ093 助理 10000
AU002 段誉 CZ092 出纳 18000
AU003 虚竹 CZ091 工程师 12000
部门编号 部门名称
CZ091 行政部
CZ092 财务部
CZ093 行政部

会出现的异常

  • 数据冗余,部门名称会出现多次。
  • 插入异常,组件一个新部门时,没员工就没有部门。
  • 删除异常,员工被删除了,部门信息也就不见了。
  • 更新异常,更新部门名称时,需要更新所有员工信息。

你可能感兴趣的:(数据库)