我们都知道在建立数据表中需要遵循一定的规则,在运用关系型数据库中的这种规则就称为范式,所以要建立合理的数据表就需要遵循这些规则。
首先先来说说数据库设计中存在哪些设计范式:最多使用的是3NF,除此之外还有针对多值依赖的第四范式,连接依赖的第五范式,DK范式和第六范式。
好了,废话不多说了,今天重点介绍下数据库设计中的三大范式:
第一范式
1NF 属性的原子性
举个例子:
ID 学号 姓名 地址 出生年月日 这个还可以 将 地址 和 出生年月日进行拆分 不符合第一范式
ID 学号 姓名 省份 市区 县区 年 月 日 字段不能再拆分 这就是符合第一范式
第一范式作为数据库中最基本的范式,要求数据表中所有的字段都是不可分割的基本数据项,也就是原子性的特征,比如上例中的地址可以再拆分为 省 市 县区。
第二范式
2NF 实体唯一性
同样也是来个例子:
学号 课程号 姓名 学分 这里边 学号 依赖于姓名 学分 依赖于 课程号
问题:
1.每行会存在相同信息
2.删除 成绩容易把课程信息干掉
3.如果学生没选课程 数据库中就不存在该学生的姓名
4.调整学分 所有的行都得更新
正确的做法 Student (学号 姓名)
Course(课程号 学分 )
选课表(学号 课程号 成绩 )
第二范式首先遵循 第一范式 记录要有唯一的标识 实体唯一性 不存在部分依赖。也就是说一个数据库表中,一个表只能保存一种数据,不能将同一种数据保存在同一张表中
第三范式
3NF 不存在传递依赖
哈哈,还是以例子来说明吧:
学号 姓名 年龄 学院 学院电话
学号 ->学生姓名 ->所在学院 ->学院电话
正确的做法 是
学生 (学号 姓名 年龄 所在学院)
学院 (学院名称 学院电话)
第三范式就是任何字段不能由其他字段派生出来 也就是说 不存在传递依赖
再举另外一个例子说明:
比如在设计一张订单数据表的时候,可以将商品的编号和订单的编号建立相应的关系,而不是将商品的信息和订单的信息放在同一张表中进行存储。
当然可以进行反范式的设计:为了提高查询 更新效率 可以适当增加冗余字段 以 空间 换时间
范式和非范式的区别:
范式
减少数据的冗余
更新 快 表 体积小
范式 比反范式 更新起来快
缺点:
查询 表关联
索引优化 难度 大
反范式
减少表关联
索引优化 比 范式优化方便
缺点
数据冗余
更新数据 成本大
如果 表 读的多 适当反范式设计 以空间 换时间 如果更新的 多 那么 遵循第三范式
从性能上讲,范式有更好的写性能,饭范式有更好的读性能。