数据库设计三大范式

  为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

  目前,主要有六种范式:第一范式、第二范式、第三范式、BC范式、第四范式和第五范式。满足最低要求的叫第一范式,简称1NF。在第一范式基础上进一步满足一些要求的为第二范式,简称2NF。其余依此类推。

  

第一范式(1NF)

  定义:如果关系模式R的每个关系r的属性都是不可分的数据项,那么就称R是第一范式的模式。

  第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

第二范式(2NF)

  定义:如果关系模式R是1NF,且每个非主属性完全函数依赖于候选键,那么就称R是第二范式。

  第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。

  也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

  不符合第二范式的例子:  
  表:学号, 姓名, 年龄, 课程名称, 成绩, 学分;  

  存在问题:  

  数据冗余,每条记录都含有相同信息; 
  删除异常:删除所有学生成绩,就把课程信息全删除了; 
  插入异常:学生未选课,无法记录进数据库; 
  更新异常:调整课程学分,所有行都调整。 

  修正: 

  学生:Student(学号, 姓名, 年龄); 
  课程:Course(课程名称, 学分); 
  选课关系:SelectCourse(学号, 课程名称, 成绩)。 


第三范式(3NF)

  定义:如果关系模式R是2NF,且关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递依赖,则称关系R是属于第三范式。  

  第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

  不符合第三范式的例子: 

  学号, 姓名, 年龄, 所在学院, 学院地点,学院联系电话,关键字为单一关键字"学号"; 

  存在依赖传递: (学号) → (所在学院) → (学院地点, 学院电话) 

  存在问题: 
  数据冗余:有重复值; 
  更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况 
  删除异常 

  修正: 
  学生:(学号, 姓名, 年龄, 所在学院); 
  学院:(学院, 地点, 电话)。 

总结

  1NF:确保每列保持原子性,字段不可分;   
  2NF:确保表中每列都和主键相关,非主键字段完全依赖主键,消除部分依赖;  
  3NF:确保每列都和主键列直接相关,而不是间接相关,消除传递依赖;  

原文地址:https://www.cnblogs.com/mengchunchen/p/9034919.html