数据库基础
码和属性
候选码
候选码就是可以区别一个元组(即表中的一行数据)的属性或属性的集合,比如学生表student(id,name,age,sex,deptno),其中的id是可以唯一标识一个元组的,所以id是可以作为候选码的,既然id都可以做候选码了,那么id和name这两个属性的组合可不可以唯一区别一个元组呢?显然是可以的,此时的id可以成为码,id和name的组合也可以成为码,但是id和name的组合不能称之为候选码,因为即使去掉name属性,剩下的id属性也完全可以唯一标识一个元组,就是说,候选码中的所有属性都是必须的,缺少了任何一个属性,就不能唯一标识一个元组了,给候选码下一个精确的定义就是:可以唯一标识一个元组的最少的属性集合。而码是没有最少属性这个要求的。
主码
从这些个候选码中选择一个做为主码,至于选择哪一个候选码,这个是无所谓的,只要是从候选码中选的就行。最极端的情况是全表都用来做主码,这时的主码也叫全码。
主属性
一个表可以有多个候选码,那么对于某个属性来说,如果这个属性存在于所有的候选码中,它就称之为主属性
依赖
完全函数依赖
设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。
部分函数依赖
设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。
传递函数依赖
设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。参考资料:数据库原理及应用
传递依赖的完整定义:设有关系模式R(U),X、Y、Z是属性或属性组,如果有X→Y,Y→Z,而且Y→X不成立、Z不是Y的子集、Z不是X的子集。注意,而且后面的三个条件必须都成立,才能称之为传递依赖。
范式
第一范式
属性不可再分解,有非空不重复主键
第二范式
关系模式R是第一范式,其中每一个非主属性完全函数依赖于R的某个候选键
第三范式
关系模式R是第二范式,每个非主属性都不传递依赖于R的候选键
BCNF:BC范式
关系模式R是第一范式,(一些资料说必须满足第三范式)且每个属性都不传递依赖于R的候选键
第四范式
范式应用实例剖析
下面以一个学校的学生系统为例分析说明,这几个范式的应用。首先第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
首先我们确定一下要设计的内容包括那些。学号、学生姓名、年龄、性别、课程、课程学分、系别、学科成绩,系办地址、系办电话等信息。为了简单我们暂时只考虑这些字段信息。我们对于这些信息,说关心的问题有如下几个方面。
学生有那些基本信息
学生选了那些课,成绩是什么
每个课的学分是多少
学生属于那个系,系的基本信息是什么。
2.1 第二范式(2NF)实例分析
首先我们考虑,把所有这些信息放到一个表中(学号,学生姓名、年龄、性别、课程、课程学分、系别、学科成绩,系办地址、系办电话)下面存在如下的依赖关系。
(学号)→ (姓名, 年龄,性别,系别,系办地址、系办电话)
(课程名称) → (学分)
(学号,课程)→ (学科成绩)
2.1.1 问题分析
因此不满足第二范式的要求,会产生如下问题
数据冗余: 同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
更新异常:
1)若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
2)假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
删除异常 : 假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
2.1.2 解决方案
把选课关系表SelectCourse改为如下三个表:
学生:Student(学号,姓名, 年龄,性别,系别,系办地址、系办电话);
课程:Course(课程名称, 学分);
选课关系:SelectCourse(学号, 课程名称, 成绩)。
2.2 第三范式(3NF)实例分析
接着看上面的学生表Student(学号,姓名, 年龄,性别,系别,系办地址、系办电话),关键字为单一关键字"学号",因为存在如下决定关系:
(学号)→ (姓名, 年龄,性别,系别,系办地址、系办电话)
但是还存在下面的决定关系
(学号) → (所在学院)→(学院地点, 学院电话)
即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。
它也会存在数据冗余、更新异常、插入异常和删除异常的情况。 (數據的更新,刪除異常這里就不分析了,可以參照2.1.1進行分析)
根据第三范式把学生关系表分为如下两个表就可以滿足第三范式了:
学生:(学号, 姓名, 年龄, 性别,系别);
系别:(系别, 系办地址、系办电话)。
总结
上面的数据库表就是符合I,II,III范式的,消除了数据冗余、更新异常、插入异常和删除异常。
已知关系R(A,B,C,D,E)和函数依赖集F为{AB→D,BC→E,D→C},R的每个属性均不可分,则R能满足的最高范式是(3) 。
供选择的答案:
(3)A. 1NF B. 2NF C. 3NF D. BCNF
试题分析:
根据函数依赖集能推导出全部属性,而且没有多余属性的属性或者属性组就是候选码。由AB→D、D→C可得AB→C,根据Armstrong推理系统中的自反律、合并规则可得AB→BC,又BC→E,所以AB→E,因此AB能推出所有属性,而且不含多余属性,所以它是候选码。R只有AB这一个候选码。显然,非主属性C、E都是传递依赖于AB,所以R不是3NF。
那么非主属性E是否部分函数依赖于码AB呢?首先来看部分函数依赖的定义:
在关系模式R(U)中,对于属性组X、Y,如果有X→Y,并且对于X的任何一个真子集X’都不能得出X’ →Y,则称Y对X完全函数依赖。而如果X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖。可见部分函数依赖是在完全函数依赖的基础上定义的,也就是说不满足完全函数依赖就是部分函数依赖。
该题中,根据Armstrong推理系统可得AB→E,属性组AB的真子集有A、B、空集φ,但由单个的A不能得出A→E,由单个的B也不能得出B→E,空集φ显然也不能得出φ→E,所以E是完全函数依赖AB。很多人在确定候选码为AB后,一看到函数依赖集中有BC→E,就误认为存在部分函数依赖,这是一个常见的误区,须仔细揣摩,理解须准确到位。
同理,可以得出其它非主属性C、D都是完全函数依赖码AB,所以R∈2NF。