• 数据库的三大范式


    第一范式(1NF):符合1NF的关系中的每个属性都不可再分,1NF是所有关系型数据库的最基本要求。

                               不符合1NF的表结构

     

                                  符合1NF的表结构

      仅仅只满足第一范式存在的问题:冗余数据过大、插入异常、删除异常、更新异常。

                            仅仅符合第一范式的表结构

      数据冗余过大:每一名学生的学号、姓名、系名、系主任这些数据重复多次。每个系与对应的系主任的数据也重复多次。

      插入异常:假如学校新建了一个系,但是暂时还没有招收任何学生(比如3月份就新建了,但要等到8月份才招生),那么是无法将系名与系主任的数据单独地添加到数据表中去的 。

              表中的所有属性不能为空。

      删除异常:假如将某个系中所有学生相关的记录都删除,那么所有系与系主任的数据也就随之消失了(一个系所有学生都没有了,并不表示这个系就没有了)。

      更新异常:假如李小明转系到法律系,那么为了保证数据库中数据的一致性,需要修改三条记录中系与系主任的数据。

      第二范式(2NF): 2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。

                        符合第二范式的表结构

      第二范式对第一范式的改进:

      数据冗余过大:学生的姓名、系名与系主任,不再像之前一样重复那么多次了。

      更新异常:李小明转系到法律系只需要修改一次李小明对应的系的值即可。

      第二范式存在的问题:

      删除异常:删除某个系中所有的学生记录该系的信息仍然全部丢失。

      插入异常:插入一个尚无学生的新系的信息。因为学生表的码是学号,不能为空,所以此操作不被允许。

      第三范式:3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。

      第三范式对第二范式的改进:

      数据冗余过大:数据冗余更加少了  

      插入异常:插入一个尚无学生的新系的信息。因为系表与学生表目前是独立的两张表,所以不影响

      删除异常:删除某个系中所有的学生记录该系的信息不会丢失。

      总结:符合3NF要求的数据库设计,基本上解决了数据冗余过大,插入异常,修改异常,删除异常的问题。当然,在实际中,往往为了性能上或者应对扩展的需要,经常 做到2NF或者1NF。

      参考资料:https://zhuanlan.zhihu.com/p/20028672

      

     

  • 相关阅读:
    HttpServletRequest request 获取form参数的两种方式
    mysql中计算两个日期的时间差函数TIMESTAMPDIFF用法
    Better exception message for missing @RequestBody method parameter
    下载Xcode历史版本方法
    CGLib与JDK的动态代理
    LeetCode: Longest Consecutive Sequence [128]
    POJ训练计划2777_Count Color(线段树/成段更新/区间染色)
    JBoss AS 7性能调优(三)
    java的Future使用方法
    Redis学习资源
  • 原文地址:https://www.cnblogs.com/shenyunwen/p/9393453.html
Copyright © 2020-2023  润新知