数据的三范式
第一范式(原子性)
数据库表中的每一列都不可以再分,也就是说原子性。例如表中包含一列叫部门岗位 其实可以拆分为部门 和岗位
第二范式(完整性)
在满足第一范式的基础上要求每个字段都和主键完整相关,而不是仅和主键部分相关(主要针对联合主键而言)完整
例如
订单编号 | 产品编号 | 产品价格 | 产品数量 | 订单金额 | 下单时间 |
---|---|---|---|---|---|
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 | 行政部 |
会出现的异常
- 数据冗余,部门名称会出现多次。
- 插入异常,组件一个新部门时,没员工就没有部门。
- 删除异常,员工被删除了,部门信息也就不见了。
- 更新异常,更新部门名称时,需要更新所有员工信息。