您的位置:首页 > 数据库

数据库的三范式

2015-11-14 23:23 369 查看

概述

数据库有几个相对于SQL语句之外的原理性基础(算是个人制造的词),罗列如下:事务的ACID属性、事务隔离级别、数据库索引、数据库设计的范式。这里就个人的理解简单谈一下三范式。

什么是范式

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

冗余较小很明确就是尽量不要重复,如果你说所有的东西放到一个表里,也没有了外键关联不是冗余更小。但是,一个数据库更重要还有结构合理。 所谓结构合理,实在冗余较小的前提下不会存在插入、更新、删除错误。

第一范式

原子性,字段不可再分

对于数据库的入门程序员,最容易犯的一个错误是把数组类型用“、,;”等符号分割,存在一个字段中。

关于第一范式Ruthless也提到了一个场景,地理位置。参见:Ruthless的数据库设计三大范式

关于这一条有很多文章写的是必须有主键,列不可分;还有的写到有主键即可,所有的关系数据库必定满足第一范式(显见是不对的)。

总结下:应该是必须有主键,列不可分。

第二范式

唯一性 一个表只说明一个事物;

第二范式主要是说关联主键时的情况,由于在实际应用中个人基本不用关联主键,即采用符合第一范式的方式,即有一个虚拟主键做单主键。

说一下第二范式的理解:即表中的字段不能单独依赖于关联主键中的某一个主键。

第三范式

每列都与主键有直接关系,不存在传递依赖;

所谓传递依赖就是指间接依赖,是说非主键字段依赖于非主键字段。以下这个小栗子说明了问题:见:张龙豪的数据库设计三大范式

比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)

这样一个表结构,就存在上述传递以来关系。 学号–> 所在院校 –> (院校地址,院校电话)

这样的表结构,我们应该拆开来,如下。

(学号,姓名,年龄,性别,所在院校)–(所在院校,院校地址,院校电话)

这个栗子,如果你说去掉所在院校,就不会反第三范式的传递依赖了。但是学校地址和院校电话就会有极大的冗余。

汇总

三范式目的很明确是要减小冗余、保证数据结构合理。要达到这个目标主要是拆分字段和拆分表,尽量达到一个字段表达一个属性,一个表表达一个对象。

第一范式是拆分字段,第二范式是拆分表。

关于反范式

反范式主要有以下场景:统计项、关联的基础数据有时效性(订单的关联价格,见: woaidongmao的数据库设计之有时不得不违背的第三范式http://www.cppblog.com/woaidongmao/archive/2009/08/20/87967.html)、数据有阶段性(比如工作流引擎中的一个申请入库申请和入库后的记录,申请通过之后才能生成记录,但是入库申请中的部分字段又有必要冗余到生成的记录中,否则一是查询不便、二是失去了实际的表的现实意义)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息