数据库三大范式浅谈

作者也是菜鸟一个,最近在学习数据库,在网上看了一些数据库三大范式详解,费了好大尽才算勉强搞明白,下面有说的不对的期望指出,一来我好改正,关键不要在误导其他新手.废话就说到这里了,直接主题了.


第一范式(1NF)无重复的列

    所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。

上面是官方解释, 我的理解是这样的.比如这样一个表  学生成绩表

学生成绩表
id 学生名 班级 考试类型 科目 分数
1 张三 3_2 其中考试 数学 89

这么垃圾的表我以前就写过,首先这种表是不符合第一范式的,

同一列中不能有多个值  班级 字段 3_2 数据原意是 3年级2班 (这个是我个人加的应为现在的关系型数据库是设计不出来不符合第一范式的表出来,原因就是数据库不支持这样的设置)

正确的方式应该把 班级分成两个列  字段应该为 年级 和班编号 

第二范式

是在满足第一范式的基础上建立起来的

要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字
上面大概的意思好像是,在一个表中不可以在一个表中表达两种或以上的事务,举个列子 

成绩表
id 姓名 科目
1 张三 数学

这种是不符合的.因为姓名和科目是两种不同的类或者说事务,就是说这两个不可以整到一个表中.但是下面这张表和上面的表是两码事

成绩表
id 姓名_ID 科目_ID 分数
1 34 2 89
上面这个表是符合第2范式的, 可以根这个列子 结合  

要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系    琢磨一下应该知道说的是什么了.
第三范式(3NF)
满足第三范式必须先满足第二范式。简而言之,第三范式要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
先来个不符合的列子

 
  
  
学生_ID 姓名 年龄 学校 学校电话
1 张三 14 蓝天小学 XXX
这个和第2范式有的相似,我的理解是在第2范式的基础上,在进行过滤或者审核, 上面学校的信息和学生信息搞在一张表上,感觉好像有点勉强,还有一个要命的隐患就是,学校的名字改了或者学校的电话改了,会怎么样, 那样的话要修改的数据数目就多了.
符合3范式的修改应该 把上面一张表,改成两个表,就是单独把学校信息 搞个表,下面结合上面的3范式,做个我还感觉合格的数据表来,共新手参考下.当然只是考虑如何符合3范式要求,并没有考虑实际应用.
 
  
  
学生信息表
学生_ID 姓名 年龄  
1 小明 14  
学校信息表
学校_ID 学校_名 学校_电话
1 蓝天小学 XXX
 
  
  
科目表
科目_ID 科目
1 语文
2 数学
考试类型表
考试类型-ID 类型
1 其中考试
2 期末考试
考试成绩表
ID 学校_ID 学生_ID 考试类型_ID 科目_ID 考试时间 考试分数
1 2 2 1 2 xxx 90
建立这么多表的好处就是,修改,扩充性强,比如如果要增加考试类型 只需要改写 考试类型表 就可以了,(但建立的表并不是越多越好,比如说把 学生信息表 姓名 和 年龄 建两张表,这样查询其来会带来没必要的麻烦),3范式本身并不是一种定义,她应该是开发者们在实际的工作中凝聚出来的经验,她的合理性是经得起考验的.最后希望这篇半抄的文稿能给人带来帮助.
 
 




猜你喜欢

转载自blog.csdn.net/jia13475881149/article/details/59481975