数据库三范式(1NF、2NF、3NF)-学习笔记

参照B站SQL案例分析:数据库三范式,不是你想的那样!所写笔记
现有如下例表(表一)

部门名称部门地址姓名性别经理职位最低月薪最高月薪电话
行政管理部办公楼一层刘一总经理240005000061238888,12312345678
行政管理部办公楼一层刘二刘一副总经理20000300006123647,12312345656
行政管理部办公楼一层张三刘一副总经理200003000061238156
财政部办公楼二层王一刘一财务经理100002000061237825
财政部办公楼二层王二王一总经理5000800061238823

在这张表中有如下问题

  • 数据冗余(重复存储数据,如部门名称中行政管理部存储多次)

数据冗余带来的问题

  • 插入异常(该表以员工为对象,举例如新成立部门,但该部门无员工,则无法进行对该部门的信息管理与维护)
  • 更新异常(在对信息进行更正时需要大量操作,容易出错,如部门地址信息更改,表中数据更正时会需要逐条更正,在更正过程中,容易漏掉信息未更正)
  • 删除异常(与插入异常同理)
规范化(normalization)

(用于数据库设计的一系列原理与技术)
作用:减少数据冗余,增加数据完整性和一致性。

第一范式(1NF)

概念:表中字段都是不可再分的原子属性*,同时表要有一个主键。
(表二)

部门名称部门地址姓名性别经理职位最低月薪最高月薪电话个人电话
行政管理部办公楼一层刘一总经理24000500006123888812312345678
行政管理部办公楼一层刘二刘一副总经理2000030000612364712312345656
行政管理部办公楼一层张三刘一副总经理200003000061238156
财政部办公楼二层王一刘一财务经理100002000061237825
财政部办公楼二层王二王一会计5000800061238823
复合主键拆分字段

假设部门加姓名不重合,将部门加姓名作为复合主键

第一范式的标准(原子属性*根据业务需求进行判断)
例如:

编号姓名性别编号姓氏名字性别
1刘备1
2关羽2
3张飞3

在不要求姓氏分开存储的业务中左边的是合理的,在要求姓氏分开储存的业务中右边是合理的。

像是原子属性*原子化学层面不可分,物理层面可分

符不符合,根据业务需求而定

像是快递地址,在填写时往往要求分开填写省份、市区、详细地址符合第一范式。

但当地址只是作为一项信息填写时,可以将整个地址作为一个符合原子属性的元素符合第一范式

第二范式(2NF)

(首先需要满足第一范式)
非主键字段必须完全依赖主键字段,不能只依赖主键的一部分

在(表二)中,我们将部门名称和姓名作为复合主键,但部门地址不完全依赖主键整体,它只依赖于部门名称这一部分信息。(冗余)

我们可以把部分依赖的部分单独提出新建一表,并进行优化(添加一个并没有实际业务意义的主键,来建立两表联系{在(表三)中为部门编号,(表三)中建立工号作为主键,对每个员工进行唯一标识})
(表三)(1)

部门编号工号姓名性别经理职位最低月薪最高月薪电话个人电话
11刘一总经理24000500006123888812312345678
12刘二1副总经理2000030000612364712312345656
13张三1副总经理200003000061238156
37王一1财务经理100002000061237825
38王二7会计5000800061238823

(表三)(2)

部门编号部门名称部门地址
1行政管理部办公楼一层
2财务部办公楼二层
第三范式(3NF)

(满足第二范式)
非主键字段不能依赖于其他非主键字段

在(表三)(1)中职位与最低月薪、最高月薪是相挂钩的,同第二范式一样,单独提出建表。
(表四)(1)

部门编号工号姓名性别经理职位编号电话个人电话
11刘一16123888812312345678
12刘二12612364712312345656
13张三1261238156
37王一1361237825
38王二7461238823

(表四)(2)

部门编号部门名称部门地址
1行政管理部办公楼一层
2财务部办公楼二层

(表四)(3)

职位编号职位最低月薪最高月薪
1总经理2400050000
2副总经理2000030000
3财务经理1000020000
4会计50008000

范式的NF增加———大表提小表

外键约束(数据过多,关系错杂,难以维护){类似上表中的部门编号、工号、职位编号}

是数据库用于参照完整型的约束,可以保证数据的完整性和一致性。

反规范化

为了提高查询性能可以降低规范化的级别,也就是反规范化(denormalization)

常用反规范化技术

  • 增加冗余字段
  • 增加计算列(直接查询,增长效率,增加内存压力)
  • 将小表合成大表

其实就是将规范化的操作颠倒

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不笑的鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值