首页 > 开发 > 综合 > 正文

数据库三大范式浅谈

2024-07-21 02:51:24
字体:
来源:转载
供稿:网友

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

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

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

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

学生成绩表
id学生名班级考试类型科目分数
1张三3_2其中考试数学89
这么垃圾的表我以前就写过,首先这种表是不符合第一范式的,

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

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

第二范式

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

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

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

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

成绩表
id姓名_ID科目_ID分数
134289
上面这个表是符合第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考试时间考试分数
12212xxx90
建立这么多表的好处就是,修改,扩充性强,比如如果要增加考试类型 只需要改写 考试类型表 就可以了,(但建立的表并不是越多越好,比如说把 学生信息表 姓名 和 年龄 建两张表,这样查询其来会带来没必要的麻烦),3范式本身并不是一种定义,她应该是开发者们在实际的工作中凝聚出来的经验,她的合理性是经得起考验的.最后希望这篇半抄的文稿能给人带来帮助.


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表