数据库三大范式的学习

数据库三大范式的学习

Scroll Down

引言
以前对数据库三范式的理解一直都很模糊,今天把三范式彻底复习一遍!
概念:什么是三大范式
三大范式:三大范式是一种数据库设计规则,它可以很好的解决数据冗余,数据有效性检查,提高数据存储效率考虑。但在平常项目开发中,有时候为了效率考虑,很多时候也并不会按照三大范式来设计数据库。
为了更好的理解三大范式我们首先要理解几种依赖关系。
一、函数依赖:函数依赖是指关系中属性间的对应关系。
(关系中对于属性(组)X的每一个值,属性(组)Y只有唯一的值与之对应,则称Y函数依赖于X,或称X函数决定Y。记作X->Y。其中X称为决定因素。)
举个依赖例子:
表1:

身份证号姓名电话
51**小明131***

单个属性依赖关系:身份证号->电话,身份证号->姓名。
如果姓名唯一的话,则还存在以下关系:
姓名->身份证号,姓名->电话
属性组的举例:
表2:

学号课程号分数
101数学91
101语文90

当学号和课程号同时确定的时候就能确定分数了。所以有【学号,课程号】->分数


在函数依赖中,还有包含其他几种情况。
1.部分函数依赖
如表一中,身份证号可以对应一个电话号码,那么身份证号+姓名对应一个电话号码也是成立的。所以就有【身份证号,姓名】->电话。此时当我们拿掉姓名这一列的时候,身份证号也可以唯一确定一个电话,所以,电话部分函数依赖于【身份证号,姓名】。
2.完全函数依赖
如果X->Y且对于X的任何真子集X'都有X'-->Y(不存在函数依赖),则称Y完全函数依赖于X。
举个例子:身份证号->电话,此时X的真子集为空。满足完全函数依赖。
【身份证号,姓名】->电话,此时X的真子集有【身份证号】,【姓名】此时存在一个依赖关系,身份证号->电话。所以不成立。
3.传递依赖
如果X,Y为关系R中属性,有X->Y,Y-->X,但Y->Z,则称Z传递函数依赖于X。
二、主码,主键,主属性,主关键字,候选关键字
主码=主键=主关键字度,关键字=候选码 候选关键字=候选码中除去主码的其他候选码

码:唯一标识实体的属性或属性组知道合称为码

候选码(关键字):某一属性组的值能唯一标识一个元组而其子集不能(去掉任意一个属性都不能标识该元组),则称该属性组为候选码版(补充元组:表中的一行即为一个元组)

主属性:候选码包含的属性(一个或多个属性)

主码(主键、主权关键字):若一个关系有多个候选码,选择其中一个为主码
码关系图
三大范式具体规则
1.第一范式(1NF):字段是原子性的,不可以分。
举个例子:
|学号|课程号|分数|班级|
|:-------:|:-------:|:------:|:------:|
|51**|小明|131***|四年级一班|
像上表中就不符合第一范式的要求,因为班级这一列,是可以再分的,可以分为几年级-几班。
2.第二范式(2NF):第二范式是在满足第一范式的前提下,且不存在任何非主属性对候选关键字的部分函数依赖,简而言之就是表必须有主键且非主键字段完全依赖主键,确保一个表只说明一个事务。
举个例子:

学号课程号姓名课程学分成绩
1111王明494

上表格中就不符合二范式的要求。从事务角度讲,这张表,可以说明两个事务,一是学号和姓名(学生信息),二是课程号和课程学分(课程信息)。
从依赖角度讲:【学号,课程号】->成绩,【学号,课程号】->姓名,对于“成绩来说”,【学号,课程号】->成绩,成绩完全依赖于【学号,课程号】,但是对于"姓名来说",学号就可以推出来姓名,所以"姓名"部分依赖于【学号,课程号】。
3.第三范式(3NF):
如果一个关系达到第二范式且不存在非主属性对候选关键字的传递函数依赖,则称为达到第三范式,简称3NF。