数据库设计-逻辑设计-范式
数据库设计-范式
为什么要使用范式?
-
-
- 数据库设计范式可以很好的为我们规避数据操作异常和数据冗余,可以更合理的设计数据库表,处理表与表之间的关系。
-
数据操作异常:
- 插入异常:本该被插入的数据没有被插入。
- 一个实体依赖于另一个实体,插入该实体时,若依赖的实体没有插入,导致无法插入数据库中。
- 更新异常:简单事实却要更新多次。
- 更新实体的单独属性时,产生多行更新。
- 删除异常:删除不该删除的数据。
- 删除一个实体实例时,导致另一个实体实例信息的丢失。
- 插入异常:本该被插入的数据没有被插入。
数据冗余:
- 相同数据多个地方存在或者表中某列可以由其他列计算得到。
关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
- 第一范式:实体的属性都是单一属性,不可再分。(原子性约束)
- 数据库表的每一列都是不可分隔的原子数据项。
例如:
学生表:主键为学号
学号 姓名 联系方式
01 张三 15022334455
02 李四 123456789@qq.com
在这个表中:联系方式不是原子数据项,它可以分为:邮箱,手机号码,固定电话等
应改为:
学号 姓名 手机号码
01 张三 15022334455
02 李四 12345678910
- 第二范式:实体的非主属性完全依赖于主关键字(单一属性或者属性组),不能仅依赖于主关键字的部分属性。(唯一性约束)
- 数据库表中的每一行必须可以被唯一地区分。
- 消除非主属性对主码的部分函数依赖。
例如:
学生表:主键为学号 学号 姓名 老师编号 老师姓名 01 张三 01 王五 02 李四 02 赵六
03 小明 01 王五
此时会产生错误:
数据冗余:多条记录都含有相同的老师;删除异常:删除所有学生信息,就把老师信息全删除了;插入异常:学生未选择老师,无法插入记录到数据库;更新异常:调整老师信息,所有行都调整。
在这个表中:码为:学号 或者 学号+老师编号 对于老师表来说:老师姓名依赖于老师编号 所以:老师姓名 即依赖于(学号+老师编号)又依赖与老师编号(部份依赖) 应改为: 学号 姓名 老师编号 01 张三 01 02 李四 02
- 第三范式:实体的非主属性不依赖于其他的非主属性,即不传递依赖于主属性。(冗余性约束)
- 数据库表中字段不能冗余出现,任何字段不能由其他字段派生出来。
- 消除非主属性对主码的传递依赖。
例如:
学生表:主键为学号 学号 姓名 学院编号 学院名称 01 张三 01 计算机 02 李四 02 经管 03 小明 01 计算机
此时会产生错误:
数据冗余:多条记录都含有相同的学院名称;删除异常:删除所有学生信息,就把学院信息全删除了;插入异常:学生未选择学院,无法插入记录到数据库;更新异常:调整学院信息,所有行都调整
在这个表中:码为:学号 或者 学号+学院编号 对于学院表来说:学院姓名依赖于学院编号 所以:学院姓名依赖于学院编号,学院编号依赖于学号(传递依赖) 应改为: 学号 姓名 学院编号 01 张三 01 02 李四 02
- BC范式:实体的非主属性不依赖于主键子集。(进一步降低冗余性)
- 对第三范式的修正,使数据库冗余性更小。
- 消除非主属性对主码子集的依赖。
反范式化:
没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。
具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余,达到以空间换时间的目的。
以上仅为本人学习过程中的知识总结,若有错误,还请诸位不吝赐教。
posted on 2019-04-22 12:10 sundaoxing 阅读(1260) 评论(0) 收藏 举报
浙公网安备 33010602011771号