zoukankan      html  css  js  c++  java
  • 数据库设计的三大范式

    引言

    关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。数据库的设计范式是数据库设计所需要满足的规范。只有理解数据库的设计范式,才能设计出高效率、优雅的数据库,否则可能会设计出糟糕的数据库。

    数据库范式的种类

    数据库的范式主要有六种:(由低到高)
    • 第一范式

    • 第二范式

    • 第三范式

    • BC范式

    • 第四范式

    • 第五范式。

    数据库设计满足最低要求的叫第一范式,简称 1NF。在第一范式基础上进一步满足一些要求的为第二范式,简称 2NF。在第二范式基础上进一步满足一些要求的为第三范式,简称 3NF。其余依此类推。

    数据库范式的理解

    数据库设计是否满足越高范式就越好?

    当然不是。满足更高范式虽然可以更好的避免数据冗余,减少数据库的占用的存储空间,减轻维护数据完整性的麻烦,但是会产生更多的小表,导致操作困难,因为需要关联查询多个小表才能得到所需要数据,而且范式越高性能就会越差。

    数据库设计的三大范式

    在实际项目开发中,要权衡是否使用更高范式是比较麻烦的事情,数据库设计一般用得最多的也就是三大范式,因为使用第一、第二和第三范式也就足够了,不仅性能好而且方便操作和管理数据。

    第一范式(1NF)

    如果一个关系表中的每一个字段都是原子项,也就是不可分割,那么该表就满足第一范式

    第一范式是关系表应具备的最起码的条件,如果数据库设计不能满足第一范式,就不称为关系型数据库。

    例如 (学生信息表):

    学生编号 姓名 性别 联系方式
    20080901 张三 email:zs@126.com,phone:13541220018
    20080902 李四 email:ls@126.com,phone:1373081235

    以上表就不符合第一范式(1NF),原因是联系方式这个字段可以再分。

    正确如下:

    学生编号 姓名 性别 电子邮件 电话
    20080901 张三 zs@126.com 13541220018
    20080902 李四 ls@126.com 13730812350

    第二范式(2NF)

    如果一个关系表中每个非主键字段都完全依赖于主键,而没有部分依赖于主键,那么该表就满足第二范式。

    这里完全依赖是啥意思,意思就是每个非主键字段是由整个主键决定的,而不能由主键的一部分来决定。这里所谓的主键一部分指的是复合主键,就是主键是由多个字段组成的,共同定义一行数据的唯一性。比较常见的复合主键就是多对多关联表时,中间表(也叫连接表)就是采用的复合主键。

    例如(学生选课表):

    学生 课程 教师 教师职称 教材 教室 上课时间
    张三 MyBatis 张老师 大数据讲师 《MyBatis深入浅出》 207 09:30
    李四 Hibernate 李老师 大数据讲师 《Hibernate 深入浅出》 208 09:30

    这里通过(学生,课程)两个字段可以确定教师、教师职称,教材,教室和上课时间,所以可以把(学生,课程)这两个字段作为复合主键。但是,教材并不完全依赖于(学生,课程),只拿出课程就可以确定教材,因为一个课程,一定指定了某个教材。

    这就叫不完全依赖,或者部分依赖。出现这种情况,就不满足第二范式(2NF)。

    正确如下:

    • 选课表:
    学生 课程 教师 教师职称 教室 上课时间
    张三 MyBatis 张老师 大数据讲师 207 09:30
    李四 Hibernate 李老师 大数据讲师 208 09:30
    • 课程表:
    课程 教材
    MyBatis 《MyBatis深入浅出》
    Hibernate 《Hibernate深入浅出》

    所以,第二范式可以说是消除部分依赖。第二范式可以减少插入异常,删除异常和修改异常。

    第三范式(3NF)

    如果一个关系表中,非主主键字段之间不存在传递依赖,那么这样就满足第三范式。

    选课表:

    学生 课程 教师 教师职称 教室 上课时间
    张三 MyBatis 张老师 大数据讲师 207 09:30
    李四 Hibernate 李老师 大数据讲师 208 09:30

    第二范式修改后的选课表中,一个教师能确定一个教师职称。这里,虽然教师依赖于(学生,课程),但教师职称仅依赖于教师,并不直接依赖于(学生,课程),这就叫传递依赖,第三范式就是要消除传递依赖。

    正确如下:

    • 选课表:
    学生 课程 教师 教室 上课时间
    张三 MyBatis 张老师 207 09:30
    李四 Hibernate 李老师 208 09:30
    • 教师表:
    教师 教师职称
    张老师 大数据讲师
    李老师 大数据讲师

    这样,新教师的职称在没被选课的时候也有地方存了,没人选这个教师的课的时候教师的职称也不至于被删除,修改教师职称时只修改教师表就可以了。

    总结

    数据库设计并非遵循越高范式越好,实际项目开发需要权衡,一般遵循三大范式:

    • 第一范式就是原子性(字段不可再分割)

    • 第二范式就是完全依赖(没有部分依赖)

    • 第三范式就是没有传递依赖

    作者:Binge
    本文版权归作者和博客园共有,转载必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    蓝桥网试题 java 基础练习 特殊的数字
    蓝桥网试题 java 基础练习 杨辉三角形
    蓝桥网试题 java 基础练习 查找整数
    蓝桥网试题 java 基础练习 数列特征
    蓝桥网试题 java 基础练习 字母图形
    蓝桥网试题 java 基础练习 01字串
    蓝桥网试题 java 基础练习 回文数
    蓝桥网试题 java 基础练习 特殊回文数
    Using text search in Web page with Sikuli
    each of which 用法
  • 原文地址:https://www.cnblogs.com/binbingg/p/13795569.html
Copyright © 2011-2022 走看看