数据库的三范式
2015-11-14 23:23
369 查看
概述
数据库有几个相对于SQL语句之外的原理性基础(算是个人制造的词),罗列如下:事务的ACID属性、事务隔离级别、数据库索引、数据库设计的范式。这里就个人的理解简单谈一下三范式。什么是范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。参见:Ruthless的数据库设计三大范式冗余较小很明确就是尽量不要重复,如果你说所有的东西放到一个表里,也没有了外键关联不是冗余更小。但是,一个数据库更重要还有结构合理。 所谓结构合理,实在冗余较小的前提下不会存在插入、更新、删除错误。
第一范式
原子性,字段不可再分对于数据库的入门程序员,最容易犯的一个错误是把数组类型用“、,;”等符号分割,存在一个字段中。
关于第一范式Ruthless也提到了一个场景,地理位置。参见:Ruthless的数据库设计三大范式
关于这一条有很多文章写的是必须有主键,列不可分;还有的写到有主键即可,所有的关系数据库必定满足第一范式(显见是不对的)。
总结下:应该是必须有主键,列不可分。
第二范式
唯一性 一个表只说明一个事物;第二范式主要是说关联主键时的情况,由于在实际应用中个人基本不用关联主键,即采用符合第一范式的方式,即有一个虚拟主键做单主键。
说一下第二范式的理解:即表中的字段不能单独依赖于关联主键中的某一个主键。
第三范式
每列都与主键有直接关系,不存在传递依赖;所谓传递依赖就是指间接依赖,是说非主键字段依赖于非主键字段。以下这个小栗子说明了问题:见:张龙豪的数据库设计三大范式
比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)
这样一个表结构,就存在上述传递以来关系。 学号–> 所在院校 –> (院校地址,院校电话)
这样的表结构,我们应该拆开来,如下。
(学号,姓名,年龄,性别,所在院校)–(所在院校,院校地址,院校电话)
这个栗子,如果你说去掉所在院校,就不会反第三范式的传递依赖了。但是学校地址和院校电话就会有极大的冗余。
汇总
三范式目的很明确是要减小冗余、保证数据结构合理。要达到这个目标主要是拆分字段和拆分表,尽量达到一个字段表达一个属性,一个表表达一个对象。第一范式是拆分字段,第二范式是拆分表。
关于反范式
反范式主要有以下场景:统计项、关联的基础数据有时效性(订单的关联价格,见: woaidongmao的数据库设计之有时不得不违背的第三范式http://www.cppblog.com/woaidongmao/archive/2009/08/20/87967.html)、数据有阶段性(比如工作流引擎中的一个申请入库申请和入库后的记录,申请通过之后才能生成记录,但是入库申请中的部分字段又有必要冗余到生成的记录中,否则一是查询不便、二是失去了实际的表的现实意义)相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- 数据库链接字符串查询网站
- DB2实例管理
- DB2实例管理
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- 创建一个空的IBM DB2 ECO数据库的方法
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- CentOS下DB2数据库安装过程详解
- EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页
- sql2008 还原数据库解决方案
- Oracle 数据库自动存储管理-安装配置
- Oracle 数据库 临时数据的处理方法
- 数据库分页查询语句数据库查询
- 最近比较流行的数据库挂马
- Oracle 手动创建数据库步骤详解
- 分割超大Redis数据库例子