扩展 6个范式
总共为:
1NF
2NF
3NF 第三范式
BCNF 3.5范式
4NF
1NF
梧桐歌名,有2个歌手,每个歌手有一个经纪公司,所以要占2条数据
- 表中的所有 字段 都具有 单一属性
2NF
- 要求表中,只具有 一个业务主键
非主属性,经纪公司,部分依赖于 候选键 {歌曲名称,歌手}
不满足 2NF —> 方法:拆分表
歌曲表:歌名 歌手
专辑表:歌名 所属专辑 专辑发布时间 专辑类别
经纪公司表:歌手 经纪公司
满足:2NF
3NF
在2NF的基础上,消除传递函数依赖。
A—> B —> C 的决定关系。C传递函数 依赖于 A。
歌曲 决定了 所属专辑
所属专辑,决定 专辑发表时间,专辑类别。
放在一起,不满足3NF—> 方法:拆分表
歌曲名称 和 所属专辑 在一个表
所属专辑的: 专辑名称,发表时间,专辑类别 在一个表
BCNF
- 所有的字段,只能和主键有关系,其他不能有关系
消除 主属性 对 主键 的部分 与 传递依赖
歌曲编号 歌曲名称 歌手
决定属性集,歌曲编号,歌手 是超键,而非候选键
不满足 BCNF
拆表:
歌曲编号 歌曲名称
和
歌曲名称 歌手 表
4NF
消除表中的 多值依赖
一事一地,一对一关系
专辑发表时间 与 专辑类别,都依赖于所属专辑,但并没有关系。
定位:需要其他各列作为 主键,产生了多值依赖。不满足4NF
专辑名字 专辑发表时间
和
专辑名称 专辑类别
反范式化
为了性能 和 读取效率 得考虑 而适当得
- 对 数据库设计 范式得 要求进行违反
允许 存在少量得 冗余
- 使用空间 来换取时间
总结
1:保证 原子性
- 梧桐 歌名,有2个歌手,每个歌手有一个经纪公司,所以要占2条数据
2:去除 非主属性 对于 主属性的 部分依赖
- 歌曲表:歌名 歌手
- 专辑表:歌名 所属专辑 专辑发布时间 专辑类别
- 经纪公司表:歌手 经纪公司
3:去除 非主属性 对于 主属性的 传递依赖
-
歌曲名称 和 所属专辑 在一个表
所属专辑的: 专辑名称,发表时间,专辑类别 在一个表
3.5:消除 主 属性 对 主属性的部分与传递 依赖。
-
歌曲编号 歌曲名称 和
歌曲名称 歌手表
4:消除表中的 多值依赖。
- 专辑名称 专辑时间 和
- 专辑名称 专辑类别。
数据库 3大范式
第一大范式
- 表中的所有 字段 都具有 单一属性
- 如:name_age 拼接的字段不行
- 单一属性:都是基本数据构成
- 都是简单的 二维表
第二大范式
- 要求表中,只具有 一个业务主键
- 不能存在 非主键列 只对 部分主键 的依赖关系
- 如:订单 1 产品1。订单1 产品2 不满足
- 要:订单1 单独一个表。
- 订单中间表:
- ID1,订单1,产品1。
- ID2,订单1,产品2。
- 不能存在 非主键列 只对 部分主键 的依赖关系
第三大范式
指 每一个 非主属性,
既不 部分依赖 也不传递 依赖于 业务主键,
- 在二范式 的基础上,相处了 非主键 对 主键的 传递依赖
- 订单编号 订单时间 客户编号 客户姓名
- 客户编号 与 客户时间,还有关系,不对。