• 数据库三范式和反三范式


      要说数据库什么最抽象,我觉得就是这个三范式,不是很好理解,但是表在设计的时候又必须要知道这么一个规则。

      首先使用最简洁的话说说这三范式:

    第一范式(1NF:The First Normal Form):每一列不能再分割。

    第二范式(2NF:The Second Normal Form):满足1NF条件下,每一列非主键列要完全依赖主键,不能只依赖联合主键中的一部分(因为主键可能是联合主键,有多列的,必须所有字段都用上 )

    第三范式(3NF:The Third Normal Form):满足2NF条件下,非主键的列不能依赖于非主键的列;

      看到这三句话肯定不理解,于是,我们用图来理解一下

    1.第一范式

      简单的来说就是不能建立下面这样的表,可以看到地址这一列是可以分割的;

      一般只要是关系型数据库建立的表都会满足第一范式的。

    2.第二范式

      看下面这个表,这里联合主键是(学号,科目),只有确定了这两个值,才能确定其他的列;比如分数,如果只依赖学号,那么当学号为1的时候,分数有两个,不能唯一确定;如果只依赖科目,当科目为语文的时候,分数也对应有两个;

      注意上面这个表中的姓名,它只是依赖学号的,根据学号就可以找对唯一对应的姓名,所以这时非主键列 “姓名”  部分依赖于联合主键“学号,科目”,不是完全依赖,所以不满足第二范式;

      我们需要将姓名这一列给提取出来,下表所示,对于完全依赖主键的放在一张表中,展示依赖一部分主键的放在另外一张表中;

     

    3.第三范式

      什么叫做非主键列不能依赖非主键列呢?看着就看不懂...

      不要急,我们再看一张表:

       我们可以知道系名可以依赖学号,毕竟一个学生肯定对应着唯一的系,但是系主任呢?系主任肯定是依赖于系名的,不可能依赖某个学生吧,所以有这样的一个依赖关系:学号->系名->系主任,系主任间接依赖于主键,这是不满足第三范式的;

      所以我们需要将系主任给拿出来,单独弄一张表:

    以上就是我对三范式的理解,看了一些视频和找了一些博客总结一下的吧,其实可以使用更加专业的话来说三范式的,有兴趣的可以看看这个老哥的博客,传送门╮(╯_╰)╭ ,这个就比较专业了,哈哈

    4.反三范式

      按理来说按照三范式设计数据库之后,可以避免冗余数据,使得数据库结构很精简;但是有时这样的设计会使得查询表的时候需要进行关联查询,比如上面说第二范式的时候,姓名那里就不需要单独弄张表出来;

      单独弄张表出来,如果有个需求要查询一个学生的名字,科目和分数,你就需要关联查询一下;但是不单独弄张表出来,你只需要查询一次就够了;

      所以适当的冗余数据是可以接受的,而且可以提高查询效率,不应该为了遵守三范式而创建设计表,应该衡量自己项目的实际需要,在三范式和反三范式之间做权衡。

      

      我这里也就是大概讲了一下我的理解,肯定有的地方不是很正确,哈哈哈,实际的项目中表肯定是非常复杂的,那就要多分析了╮(╯_╰)╭

  • 相关阅读:
    oracle的根容器下新建pdb容器及本地用户
    oracle监听配置与防火墙问题
    oracle问题:ORA-09817及解决办法
    Oracle:Ora-01652无法通过128(在temp表空间中)扩展temp段的过程-解决步骤
    oracle:ORA-14765建索引阻塞创建分区及处理步骤
    oracle-组合索引字段位置与查询效率之间的关系
    hbase的split策略和预分区
    启动hbase后hmaster自动关闭
    hive一级分区、二级分区、动态分区
    hive beeline连接和交互shell连接
  • 原文地址:https://www.cnblogs.com/wyq1995/p/14282564.html
Copyright © 2020-2023  润新知