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

数据的三范式

第一范式(原子性)

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

第二范式(完整性)

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

例如

订单编号产品编号产品价格产品数量订单金额下单时间
ORD0001PDT52710026802019/10/22
ORD0001PDT57812046802019/10/22
ORD0012PDT579802987652019/11/21
ORD0012PDT577775587652019/11/21

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

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

订单编号产品编号产品价格产品数量
ORD0001PDT5271002
ORD0001PDT5781204
ORD0012PDT5798029
ORD0012PDT5777755
订单编号订单金额下单时间
ORD00016802019/10/22
ORD00016802019/10/22
ORD001287652019/11/21
ORD001287652019/11/21

第三范式(直接性)

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

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

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

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

会出现的异常

  • 数据冗余,部门名称会出现多次。
  • 插入异常,组件一个新部门时,没员工就没有部门。
  • 删除异常,员工被删除了,部门信息也就不见了。
  • 更新异常,更新部门名称时,需要更新所有员工信息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值