热衷技术,热爱交流
分类: Oracle
2013-06-12 14:53:42
关系模式用五元组表示,R(U,D,DOM,F),U表示属性,D表示域,DOM表示属性到域上的映射。一般不用研究关系的域以及属性到域上的映射,但是需要研究内部属性的依赖关系-函数依赖R(U,F)。
不好的关系模式会引发数据冗余,插入,更新,删除的异常,所以,需要研究如何解决这些问题。
实际上就是定义了两部分属性(x,y),如果x分量上相等,那么y上必须相等,例如资产表,ip地址和mac,序列号,实际上是相互函数依赖的关系。
完全函数依赖指的是Y函数依赖X,但是不函数依赖X的真子集,那么Y完全函数依赖于X。如果Y还函数依赖X的某个真子集,那么叫做部分函数依赖。
码的概念其实就是,如果R(U,F)对与某组属性X,U完全函数依赖X,那么X叫做关系的候选码,如果有多个候选码,可以选取一个码作为主码。如果R中某个属性是另外一个关系的主码,那么这个属性叫做这个关系的外码。
关系数据库中的关系要满足于一定的要求,满足不同程度的要求叫做满足不同范式。
一个低一级的范式通过模式分解,转换为若干高一级的范式,叫做规范化。
关系中每个属性都是不能再分的数据项,也就是不允许表中有表
例如,学生成绩一列,不能再分为期中成绩和期末成绩。
所谓2范式,指的是关系中每个非主属性都要完全函数依赖主属性。
再如:
员工效率表:
员工 零件 工时 零件存放仓库 仓库负责人
在这个关系中,(员工,零件)是组合主属性。同时,由于零件只能在一个仓库,所以仓库也函数依赖零件,也就是说仓库对(员工,零件)来说,是部分函数决定,这就不满足二范式。
异常情况:增加仓库,这个仓库并没有零件,由于没有主键,所以没法添加
修改某个零件的仓库时,需要修改一大堆记录;
删除零件时候,把对应的仓库都删掉了;
需要分解成两个关系,消除部分函数依赖:
(员工,零件,工时),(零件,仓库 仓库负责人)
考虑上面分解后的关系:(零件,仓库 仓库负责人)
零件只属于一个仓库,一个仓库只能有一个负责人,所以零件就间接决定了仓库负责人。也就是说,这个关系存在非主属性对主属性的传递函数依赖。
异常情况:
增加了一个仓库,但是还没有放零件,那么这个仓库就添加不进去。
删除了一个零件,把仓库都删没了
修改一个仓库的负责人,由于数据冗余严重,可能需要修改很多行。
使用属性投影分解法进行规范化:
(零件,仓库),(仓库,仓库负责人)
这样,分解后的3范式就消除了传递函数依赖,也就是消除了非主属性之间的完全函数依赖。
每一个决定因素都必须包含码!
考察表(学生姓名 课程 教师)
每个学生可以选多课程:(学生-课程)--》教师
每个老师教一门课,每一门课程可以由多个老师教授:教师—》课程
学生 课程 教师
李四 数学 黎明
王五 数学 刘德华
这个关系的主属性是(学生-课程)
这个关系满足1NF,2NF,3NF,因为没有非主属性对码传递依赖或者部分依赖。这里需要注意的是,教师虽然可以函数决定课程,但是它不能决定学生,所以它并不是码。这不满足决定因素必须包含码的规范。
一般而言,满足3范式就ok了。