https://blog.csdn.net/ljp812184246/article/details/50706596
1NF,2NF,3NF,BCNF,4NF,5NF:
5 范式:https://www.cnblogs.com/leodaxin/p/7425580.html
一般到 BCNF 就足够了
三大范式:
1NF:
每个属性(字段)都不可再分,即一个字段不能表示多个属性
2NF:
属性完全依赖于主键,消除部分子函数依赖。即对组合主键来说,其他属性不能只依赖主键中的某一个
组合主键:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
应该分成三个表:
- 学生:Student(学号, 姓名, 年龄)
- 课程:Course(课程名称, 学分)
- 选课关系:SelectCourse(学号, 课程名称, 成绩)
所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。
例子:一个订单有多个产品
优化:使用中间表,进行多对多的关联
3NF:
属性不依赖于其他非主属性,消除传递依赖。即提取子表,使用外键,减少冗余
(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)
应该分成两个表:
- 学生:(学号, 姓名, 年龄, 所在学院);
- 学院:(学院, 地点, 电话)
BCNF:
不存在任何字段对任一候选关键字段的传递函数依赖
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
改进:
仓库管理:StorehouseManage(仓库ID, 管理员ID);
仓库:Storehouse(仓库ID, 存储物品ID, 数量)。
优点:
- 保证数据的一致性
- 数据冗余
- 插入异常
- 删除异常
缺点:
- 多表查询,查询性能降低。提高 sql 复杂度
反范式:
冗余
一次查询,不需要关联表操作
优点:
- 提升查询性能