简单的说,三个范式不是数据表里的概念,而应该是关系型数据库的概念,但是,既然要处理数据,就必须要了解并尽量的去理解和遵守三个范式,这样一步一步的搭建起来的数据结构,或者说用不同的数据表保存的数据,后期才能互相关联起来,从而实现关系型数据库表之间的基本关系,互相查询并重新建立新的需要的表格。
什么是关系型数据库?
这个概念有点复杂,大家可以去度娘一下,但是,小甚想简单的说,所以的关系型数据结构,就是一个一个的圆,圆之间有共同的列,于是,可以把一个圆的内容,与另一个圆的内容联接起来,这样,一项工作一个圆,不同的工作之间的圆在需要的情况下都可以联接到一起,把每个圆当成一个数据表,就形成了一个大的数据结构。关系型数据库的理论,就象PS的通道理论一样,是渗透到各行各业的,而且只会不断的发展,短时间内不会淘汰的理论,应用的范围会越来越广。
接下来回归正传,讲三个范式,所谓范式,就是规则,就象二十九条军规一样,就象三大纪律八项注意一样,就象约法三章一样。三个范式,就是在建立基础表的时候,要遵守的三个原则,但是这三个范式,从一到三,从低到高,满足第一范式以后,才能遵守第二范式、第三范式,不能跳过第一范式、第二范式去满足第三范式,当然,有时候也不必要一定要满足三个范式,有些基础表的建立,满足第一范式和第二范式就可以了。
第一范式
表的每一列都是不可分割的数据项,而不能是集合,数组等。即属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。
简单地说,基础表的第一列,都只能是单一的属性值,而不能是多个属性,列的建立要不可再分。
第二范式
要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。第二范式(2NF)要求实体的属性完全依赖于主关键字。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。
这一范式意思是,基础表里的每一行,都具有唯一的属性,比如记录学生的信息,要有唯一的学号,记录人员信息有唯一的身份证号,姓名往往会有重名,所以一般不作为主键使用。再比如销售明细里,虽然客户编号可能是重复的,但是订单号必须是唯一的。
第三范式
任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)。第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。
如果说第二范式比较容易理解,第一范式在做表的过程中,还是可以纠正的,但是,第三范式是最不容易理解的。
第三范式的要求其实就是,一个表中的非主键列,不能在另一个表中作为非主键出现。理论上来说,如果一个表中的非主键在另一个表中大量的被引用,当源表中的信息进行更新的时候,会导致引用表中的信息无法被更新。
再举个例子,如果学生名单中的,学生成绩,在另一张数据表中被引用,当这个学生的成绩被修改的时候,引用成绩的数据表必须同步进行修改,但是这样的工作量是极端复杂,如果有一百个数据表引用了成绩,要依次进行修改,所以第三范式要求A表中的非主键不能在B表中作为非主键引用。
那么B表如果需要A表中学生的成绩怎么办呢?后期进行查询的时候,再具体讨论,是可以通过主键的联接,把两个表联接到一起,从而选取两个表中需要的列建立一个新的查询表,随用随查询,而这个查询是可以随时根据源表自动进行更新的。
今天的内容有点复杂,欢迎大家跟小甚私信交流。也许有些童鞋会觉得,做一个数据表,没必要学习这么复杂的理论吧,小甚想跟大家说确实是很有必要的,从基础表的建立开始,就依据标准的范式,后期很有很大的拓展空间,否则,后期的数据表无法进行联接处理。
数据处理有一句名言:垃圾进垃圾出。如果开始的时候基础表建立的就不健康,后期很难处理。