数据库基础

数据库基础

码和属性

候选码

候选码就是可以区别一个元组(即表中的一行数据)的属性或属性的集合,比如学生表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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值