数据库设计-逻辑设计-范式

数据库设计-范式

为什么要使用范式?

      • 数据库设计范式可以很好的为我们规避数据操作异常和数据冗余,可以更合理的设计数据库表,处理表与表之间的关系。

数据操作异常:

    1. 插入异常:本该被插入的数据没有被插入。
      • 一个实体依赖于另一个实体,插入该实体时,若依赖的实体没有插入,导致无法插入数据库中。
    2. 更新异常:简单事实却要更新多次。
      • 更新实体的单独属性时,产生多行更新。
    3. 删除异常:删除不该删除的数据。
      • 删除一个实体实例时,导致另一个实体实例信息的丢失。

数据冗余:

  • 相同数据多个地方存在或者表中某列可以由其他列计算得到。

 

关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(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)    收藏  举报

导航