数据库三大范式和个人看法

三大范式图解概括

在这里插入图片描述

第一范式(1NF)

确保数据库表字段的原子性
会存在数据冗余过大,插入异常,删除异常,修改异常的问题
举例:

某个字段name:‘西瓜 1566666‘
依照第一范式就需要拆分成 name:‘西瓜’ ,phone:'156
6666’

在这里插入图片描述------>拆分成 ![在这里插入

第二范式(2NF)

首先要满足第一范式,另外包含两部分内容,一是表必须有一个主键;二是非主键列必须完全依赖于主
键,而不能只依赖于主键的一部分。

举例:

这是一个课程关系表,
其中fraction(分数)完全依赖subject(课程)
其中name(姓名),age(年龄)完全依赖s_num(学号)
不符合第二范式
会导致数据冗余(学生考n门课程,姓名年龄有n条记录)、插入异常(插入一门课程,因为没有学号,无法保存新课程记录)等问题。
应拆分成三个表
studen(表名) id,s_num, name age
course(表名) id,subject, fraction
student_course(表名) s_id ,c_id ,grade

在这里插入图片描述-------->拆分成
在这里插入图片描述------在这里插入图片描述-----在这里插入图片描述

第三范式(3NF)

首先要满足第二范式,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列
A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。

举例:

为了满足第三范式,消除依赖传递,应该继续拆分

在这里插入图片描述----在这里插入图片描述-----在这里插入图片描述----在这里插入图片描述

2NF和3NF的区别?

2NF依据是非主键列是否完全依赖于主键,还是依赖于主键的一部分。
3NF依据是非主键列是直接依赖于主键,还是直接依赖于非主键。

个人看法

实际业务中除了数据冗余,还有性能、复杂度、容灾、安全性等多个考虑因素。如果为了减少冗余,造成数据库性能暴跌,或是编程复杂性大增,都是不可接受的。但是具体到底选择向哪个方向妥协,这就是工作经验了。

如果完全按照第三范式,那么数据的查询一定需要大量的表关联,自然会造成性能上的问题,在阿里巴巴开发规约中,明确说明了禁止超过三表关联,为了满足规范,最简单的解决方法就是可以允许表中一些字段的传递依赖,造成数据冗余 ,这样在一些查询query的情况下,可以不用频繁的联表操作,提高查询效率,典型的空间换时间,具体冗余和分表的界限就需要根据实际开发来解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值