转自牛人关于 数据库范式 的
范式是什么
范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
范式的原理
- 第一范式(1NF)无重复的列
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。
说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
- 第二范式(2NF)属性完全依赖于主键[消除部分子函数依赖]
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是属性完全依赖于主键。
- 第三范式(3NF)属性不依赖于其它非主属性[消除传递依赖]
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。
那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。
范式的说明
- 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
通俗的理解是字段还可以再分吗?如过不能,则是符合1NF的设计。
- 第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
简单的解释,比如你和一个女生约会建立一张表,不用每条约会记录都记录她的身高、体重,将身高体重单独的存在一张表中供查询即可。
- 第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
打个比方,比如评论表,如果你将用户ID,用户头像都放在这留言表中,就是不合适的了。用户头像是依赖于用户ID,而不依赖该评论。
我对范式的理解
一个严格恪守数据库设计范式来进行数据库设计的人,必定是个傻球;
一个没有研究过数据库设计范式就进行数据库设计的人,必定也是个傻球;
在现代数据库设计中,尤其是web 2.0的系统中的数据库设计,我可以断言,大多数都是违反2NF、3NF的,少数设计甚至是违反1NF的。数据库设计范式只是对数据库惯用设计的一些说明,并不能定性为标准。
而从数据库的发展来看,以MySQL举例,随着MySQL实现越来越多的功能,它的宣传材料上会越来越多的出现以前被MySQL所摒弃的复杂设计理念,并且宣称这是MySQL所独创或一贯倡导的。这是一个数据库系统发展所必然经历的过程。而这却会给MySQL的使用者以极大的误导,从而忽视了是否新特性是业务所真正需要的。
数据库设计不是一种编程语言这么简单,与面向对象、面向过程无关。数据库设计代表的是一种与应用开发语言完全不同的思想。现在绝大多数的程序,无论任何人采用什么方式进行程序开发,其最终还是会回归到对数据库的操作上(当然如果你的程序只是个教学演示则不在此范围内)。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25082959/viewspace-693745/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25082959/viewspace-693745/
转自牛人关于 数据库范式 的相关推荐
- cv/dl/cl领域的实验室官网/牛人主页/技术论坛/比赛数据库/好玩的东西
#技术论坛 1/mit的关于关于机器人的技术review https://www.technologyreview.com/c/robotics/ 2/valse视觉与学习青年学者讨论会 http:/ ...
- 数据库牛人牛新庄的成长历程
转自:http://www.zreading.cn/archives/1659.html 还记得"计算机高手是怎么炼成的"这篇文章吗?我发现讲故事比单纯的讲道理更具有感染力,所以, ...
- 数据库牛人牛新庄的成长历程(转)
还记得"计算机高手是怎么炼成的"这篇文章吗?我发现讲故事比单纯的讲道理更具有感染力,所以,今天我要再给大家 讲另外一个人的故事--牛新庄,IT独行侠,他的成长历程.我又发现,IT界 ...
- 绝对受用的求职经验分享,是天津大学一牛人写的,很
绝对受用的求职经验分享 感谢天津大学写这篇求职经历的那位研究生. 目录 关于我的系列文章的解释和说明 我的求职历程及经验分享(一):求职历程总结 我的求职历程及经验分享(二):前期准备 我的求职历程及 ...
- 转:不是技术牛人,如何拿到国内IT巨头的Offer
转自:http://blog.csdn.net/lsldd/article/details/13506263 不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛 ...
- 这样的“牛”人,绝佳客户最好能多碰上上几个是我们当程序员的好运
前2天看了老代的 这样的"牛"人最好别碰上 稍微有点儿感触,同样是客户可能差别都非常大.最近一个月我碰上了一个这样的客户他来自台湾,他在网上看到了我的作品,给我写了邮件要购买源码, ...
- 四位科研牛人介绍的文献阅读经验
每天保持读至少2-3 篇的文献的习惯.读文献有不同的读法,但最重要的自己总结概括这篇文献到底说了什么,否则就是白读,读的时候好像什么都明白,一合上就什么都不知道,这是读文献的大忌,既浪费时间,最 ...
- 数据库范式的思考以及数据库的设计
数据库范式--通俗易懂[转] 数据库范式是数据库设计中必不可少的知识,没有对范式的理解,就无法设计出高效率.优雅的数据库.甚至设计出错误的数据库.而想要理解并掌握范式却并不是那 么容易.教科书中一般以 ...
- 机器学习部分国内牛人
=======================国内==================== 之前自己一直想总结一下国内搞机器学习和数据挖掘的大牛,但是自己太懒了.所以没搞- 最近看到了下面转载的这篇博 ...
- 牛人主页(主页有很多论文代码)【真的好强大】
转自:http://blog.sina.com.cn/s/blog_6833a4df01012bcf.html 牛人主页(主页有很多论文代码) Serge Belongie at UC San Die ...
最新文章
- 万字长文详解Docker架构原理及功能使用!
- JavaScript 中的return true 和return false
- 引入Jaeger——使用
- jQuery学习笔记之jQuery的DOM操作
- winform中listview选中整行_工作中常见的11个Excel难题,一次解决!
- Excel复制粘贴——跳过空单元格案例
- MS SQL入门基础:打开游标
- springboot08 自动配置原理
- 译:在C#中使用LINQ To SQL
- IOS-播放器开发(1)-视频基本原理
- 方差分析(Analysis of Variance,ANOVA)是什么?怎么就可以用来做特征筛选?方差分析(ANOVA)的本质是什么?
- Elasticsearch:使用 Python 进行 Bulk insert 及 Scan
- crmeb知识付费二开文档
- codeforces 558 D Guess Your Way Out! II
- C++ 函数其实可以不用写返回值的声明!
- 解决vim不能使用方向键和退格键问题
- hexo史上最全搭建教程(转载)
- 你知道管理工作中要远离三只猫吗?
- Linux下安装Oracle 11g详细过程
- python利用近似公式计算π_python如何利用公式计算π