数据库设计中的范式总结

看到一本书,提到:在web2.0时代,大型的网站在架构中面对海量的数据,以及频繁的查询时如何才能很好的处理。其中提到一句“在多对多的关系充斥的时代,第三范式首先应该被抛弃”。

看到这一句,我受到了一些震撼,因此特别总结一下:

 

第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。

第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。

假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:
  (学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
  这个数据库表不满足第二范式,因为存在如下决定关系:
  (课程名称) → (学分)
  (学号) → (姓名, 年龄)
  即存在组合关键字中的字段决定非关键字的情况

 

第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。

假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系:
  (学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)
  这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:
  (学号) → (所在学院) → (学院地点, 学院电话)
  即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。

到这里,明白了三个范式的意义。

 

平时我们在设计数据库时,往往以三范式作为基准,因此很习惯的将第三范式作为一个设计良好的数据库的标准。

但是,在实际中,我们有的时候还必须不能遵守第三范式。

我们知道,第三范式带来的好处就是将消除了依赖传递,使得表设计简洁,清晰,单表字段、占用空间都小。

但是第三范式的弊端在于关联性太多,如是在对于查询时,会造成瓶颈。

由此回到前面所说的“第三范式首先应该被抛弃”....

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章