`
liuzhifu123
  • 浏览: 34620 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关系模式规范化实例析解

 
阅读更多
关系模式规范化实例析解
 

2010-07-23 来源:网络

 

摘要:关系模式是关系数据库的重要组成部份,其规范化理论在整个模式设计中占有主导地位。下面我们试图采用接近课堂教学的方式给出一个完整实例,希望对初学者有所帮助。

关键词:关系模式;规范化;函数依赖;范式

众所周知,关系模式是关系数据库的重要组成部份,其好坏直接影响关系数据库的性能。而关系模式的设计必须满足一定的规范化要求,从而满足不同的范式级别。[1](P.46-52,57)在指导关系模式的设计中,规范化理论占有着主导地位,其基本思想是:消除数据依赖中不合理的部份,使各关系模式达到某种程度的分离,使一个关系仅描述一个实体或者实体间的一种联系。[2]关系模式及其规范化的理论是我们设计和优化关系模式的指南。作为一种优秀而成熟的理论,学习和实践会有一定的难度,但在因特网和相关书籍中难得有比较全面的实例,给我们学习和实践造成不便。下面,我们试图采用接近课堂教学的方式给出一个完整的析解实例,以期对初学者有所帮助。

一、实例

假设某商业集团数据库中有一关系模式R(商店编号,商品编号,数量,部门编号,负责人),如果规定:

(1) 每个商店的每种商品只在一个部门销售;

(2) 每个商店的每个部门只有一个负责人;

(3) 每个商店的每种商品只有一个库存数量。

试回答下列问题:

(1) 根据上述规定,写出关系模式R的基本函数依赖;

(2) 找出关系模式R的候选关键字;

(3) 试问关系模式R最高已经达到第几范式 为什么

(4) 如果R已达3NF,是否已达BCNF 若不是BCNF,将其分解为BCNF模式集。

二、预处理

为了方便,我们用代号代表每个属性:

A—商店编号

B—商品编号

C—部门编号

D—数量

E—负责人

这样,有关系模式:

R(U,F)

U={A,B,C,D,E}

三、根据上述规定,写出关系模式R的基本函数依赖

为了消除关系模式在操作上的异常问题,优化数据模式,我们需要对关系模式进行规范化处理。而首先需要做的就是函数依赖,以便能确切地反映实体内部各属性间的联系。[2](P.经过对数据语义的分析我们得出下面的依赖关系:

1.语义:每个商店的每种商品只在一个部门销售,即已知商店和商品名称可以决定销售部门

例:东店——海尔洗衣机—— —定在家电部销售

所以得出函数依赖:AB→C

2.语义:每个商店的每个部门只有一个负责人,即已知商店和部门名称可以决定负责人

例:东店——家电部——部门经理一定是张三

所以得出函数依赖是:AC→E

3.每个商店的每种商品只有一个库存数量,即已知商店和商品名称可以决定库存数量

例:东店——海尔洗衣机——库存10台

所以得出函数依赖是:AB→D

这样:在关系模式R(U,F)中,基本函数依赖集是:F={ AB→C ,AC→E,AB→D }。

四、找出关系模式R的候选关键字

根据函数依赖和关键字的基本定义,我们可以说:只有在最小函数依赖集中才能科学、正确地寻找候选关键字。那么何为最小函数依赖集 又怎么求出F的最小函数依赖集呢 根据函数依赖的相关定理我们得知:给定函数依赖集F,如果F中每一函数依赖X->Y∈F满足:(1)X->Y的右边Y为单个属性(F为右规约的);(2)F为左规约(即F中任一函数依赖X→Y∈F的左边都不含多余属性);(3)F为非冗余的(即如果存在F的真子集F’,使得F’≡F,则称F是冗余的,否则称F是非冗余的);则称F为最小函数依赖集,或称F是正则的。每一个函数依赖都等价于一个最小函数依赖集。[3](P.150)按照上面的三个条件进行最小化处理,我们可得到一个求最小函数依赖集方法:第一步,为满足条件1,根据分解性把右侧是属性组的函数依赖分解为单属性的多个函数;第二步,为满足条件2,逐一考察最新F中的函数依赖,消除左侧冗余属性;为满足条件3,逐一考察最新F中函数依赖X->Y,检查X->Y是否被F-{X->Y}所蕴涵,如果是,则X->Y是冗余的,可以删除。[4]所以,F的所谓最小函数依赖集就是去掉了多余依赖的F。按上面提供的算法依据具体计算如下:

1.根据分解性先分解所有依赖的右边为单属性:

可以看出:F={ AB→C ,AC→E,AB→D }中所有依赖的右边已为单属性。

2.对所有依赖的左边为多属性的情况,消除左侧冗余属性:

下面计算判断AB→C中有无无关属性:

(1)设A→C,在F={ AB→C ,AC→E,AB→D }中计算A的闭包A+ :

首先,初始化A+ = {A};经观察,在F={ AB→C ,AC→E,AB→D }中,属性A不能“带进”任何属性。即A的闭包A+ 就是{A},也就是A+ = {A},所以AB→C中B不是无关属性。

(2)设B→C,在F={ AB→C ,AC→E,AB→D }中计算B的闭包B+:

首先,初始化B+ = {B};经观察,在F={ AB→C ,AC→E,AB→D }中,属性B不能“带进”任何属性。即B的闭包B+就是{B},也就是B+ = {B},所以AB→C中A不是无关属性。

(3)同理,AC→E和AB→D中左边亦无无关属性。

3、下面计算在F={ AB→C ,AC→E,AB→D }中有无冗余依赖:

我们去掉AB→C,依赖集变为F={ AC→E,AB→D }。

首先, 初始化{AB}+ = {A,B} ;在F={ AC→E,AB→D }中,有AB→D,即AB可以“带进”D属性 ,这时{AB}+ = {A,B,D};经观察已不能再“带进”其它属性。即{AB}的闭包{AB}+ 就是{A,B,D},也就是{AB}+ = {A,B,D}。

因为{A,B,D}中不包含C,所以我们说AB→C不是冗余依赖。

同理计算,AC→E和AB→D亦不是冗余依赖。

到此,才能肯定F={ AB→C ,AC→E,AB→D }已是最小函数依赖集。

4、寻找候选关键字也需要一定的计算,下面计算R的候选关键字:

在F={ AB→C ,AC→E,AB→D }中,我们对所有属性进行归类如下:

L类属性,即仅在依赖左边出现的属性:A,B

R类属性,即仅在依赖左边出现的属性:E,D

LR类属性,即既在依赖左边又在依赖右边出现的属性:C

N类属性,即既不在依赖左边又不在依赖右边出现的属性:无

我们知道,L类属性和N类属性一定在候选关键字中,R类属性一定不在候选关键字中。

所以,A,B一定在候选关键字中,E,D一定不在候选关键字中。这是定性的结果。

具体的候选关键字是什么呢

首先,计算L类属性AB的闭包:{A,B}+ ={A,B,D,C,E},因为AB的闭包{A,B,D,C,E}已经包含了所有R的属性,所以,{A,B}是唯一候选关键字。

对于LR类属性参与候选关键字的相关计算稍嫌复杂,但这里已经找出了关系模式R{A,B,C,D,E}的唯一候选关键字。[3](P.148-150)

五、关系模式R最高已经达到第几范式 为什么

很明显,关系模式R(A,B,C,D,E)中的所有属性值都是不可再分的原子项,所以该关系模式已满足第一范式。[1](P.53)那么关系模式R(A,B,C,D,E)是否满足2NF

根据范式的相关定义我们得知:如果关系模式R(U,F)中的所有非主属性都完全函数依赖于任一候选关键字,则该关系是第二范式。[1](P.54)从上面的分析我们知道R(A,B,C,D,E)的唯一候选关键字是{A,B};非主属性是:C、D、E ;函数依赖集是{ AB→C ,AC→E,AB→D }。所以:

AB→C

例:东店——海尔洗衣机—— —定在家电部销售

AB→D

例:东店——海尔洗衣机(——只在家电部销售)——库存10台

AB→E

例:东店——海尔洗衣机(——卖海尔洗衣机的部门——家电部)——部门经理是张三

关系模式R(A,B,C,D,E)已满足2NF。

进一步分析:非主属性C、D、E之间不存在相互依赖,即关系模式R(A,B,C,D,E)不存在非主属性对候选关键字的传递依赖,根据第三范式的定义,关系模式R(A,B,C,D,E)已满足3NF。[1](P.55)

六、R已达3NF,是否已达BCNF 若不是BCNF,将其分解为BCNF模式集

由BC范式的定义得知:如果关系模式每个决定因素都包含关键字(而不是被关键字所包含),则R满足BC范式。[1](P.56)分析:在F={ AB→C ,AC→E,AB→D }中,有依赖AC→E的左边{A,C}不包含候选关键字{A,B},即AC→E是BCNF的违例。所以,关系模式R(A,B,C,D,E)不满足BCNF。

1、下面分解关系模式R(A,B,C,D,E):

分解3NF,有一定的规则。

从BCNF违例AC→E入手,我们得到两个新关系模式:R1(A,C,E)和R2(A,C,B,D)

R1由违例的所有属性组成,R2由违例的决定因素和R的其余属性组成。即:R1(商店编号,部门编号,负责人),实际上描述了“负责人”这一件事。R2(商店编号,商品编号,部门编号,数量),实际上描述了“商品库存”这一件事。已经做到了“一事一地”的原则了,应该能符合更高的范式,但还得经过计算和判断。

2、下面我们判断R1是否满足BCNF:

对于一个新关系,不知道它的依赖集,不知道它的候选关键字,我们需要借助原R(A,B,C,D,E)的依赖集F={ AB→C ,AC→E,AB→D }。

分享到:
评论

相关推荐

    Perl 实例精解(第三版).pdf

    13.2.6 析构函数和无用存储单元收集 13.3 继承 13.3.1 @ISA数组和调用方法 13.3.2 $AUTOLOAD,sub AUTOLOAD和UNIVERSAL 13.3.3 派生类 13.3.4 多重继承 13.3.5 面向对象术语--父方法 13.4 ...

    C#语言规范(2.0,3.0,4.0合集)

    10.5.5.2 实例字段初始化 295 10.6 方法 296 10.6.1 方法形参 298 10.6.1.1 值参数 299 10.6.1.2 引用形参 299 10.6.1.3 输出形参 300 10.6.1.4 形参数组 301 10.6.2 静态方法和实例方法 303 10.6.3 虚方法 304 ...

    C#教程(语言规范)

    7.15.4.2 局部变量实例化 ... 186 7.15.5 匿名函数表达式的计算 188 7.16 查询表达式 ... 188 7.16.1 查询表达式中的多义性 189 7.16.2 查询表达式转换... 189 7.16.2.1 带有延续部分的 Select 和 groupby 子句...

    C#语言规范4.0

    7.15.5.2 局部变量实例化 207 7.15.6 匿名函数表达式计算 209 7.16 查询表达式 209 7.16.1 查询表达式的多义性 210 7.16.2 查询表达式转换 210 7.16.2.1 带继续符的 select 和 groupby 子句 211 7.16.2.2 显式范围...

    微软C#语言规范,C#语言教程中文版

    7.15.5.2 局部变量实例化 207 7.15.6 匿名函数表达式计算 209 7.16 查询表达式 209 7.16.1 查询表达式的多义性 210 7.16.2 查询表达式转换 210 7.16.2.1 带继续符的 select 和 groupby 子句 211 7.16.2.2 显式范围...

    C#语言规范(4.0版本)

    7.15.5.2 局部变量实例化 207 7.15.6 匿名函数表达式计算 209 7.16 查询表达式 209 7.16.1 查询表达式的多义性 210 7.16.2 查询表达式转换 210 7.16.2.1 带继续符的 select 和 groupby 子句 211 7.16.2.2 显式范围...

    C#_语言规范_4.0_中文版

    7.15.5.2 局部变量实例化 207 7.15.6 匿名函数表达式计算 209 7.16 查询表达式 209 7.16.1 查询表达式的多义性 210 7.16.2 查询表达式转换 210 7.16.2.1 带继续符的 select 和 groupby 子句 211 7.16.2.2 显式范围...

    CSDN 微软技术高级讲师.NET技术企业高级培训PPT

    (9) 实例化委托 (10) 调用委托 (11) 异步委托 (12) 异步委托的定义 (13) 异步委托的四种调用方法 (14) 什么是事件 (15) 定义事件 (16) 订阅事件 (17) 触发事件 (18) 引发事件 (19) ...

    dot NET技术企业高级培训PPT

    (9) 实例化委托 (10) 调用委托 (11) 异步委托 (12) 异步委托的定义 (13) 异步委托的四种调用方法 (14) 什么是事件 (15) 定义事件 (16) 订阅事件 (17) 触发事件 (18) 引发事件 (19) ...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    类变量的作用及析构函数 类的继承 经典类与新式类的继承顺序 继承实例讲解 多态实例讲解 本节作业之选课系统开发 第7周 心灵分享 上节回顾 静态方法、类方法、属性方法 课堂扯淡 深入讲解类的特殊成员方法__init__...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     16.1.5 控制实例化 597  16.1.6 效率与灵活性 599  16.2 模板实参推断 600  16.2.1 类型转换与模板类型参数 601  16.2.2 函数模板显式实参 603  16.2.3 尾置返回类型与类型转换 604  16.2.4 函数指针和实参...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     16.1.5 控制实例化 597  16.1.6 效率与灵活性 599  16.2 模板实参推断 600  16.2.1 类型转换与模板类型参数 601  16.2.2 函数模板显式实参 603  16.2.3 尾置返回类型与类型转换 604  16.2.4 函数指针和实参...

    Visual C# 2005程序设计自学手册 随书源码第一部分(共三部)

    5.3.1 对象的声明和实例化 90 5.3.2 类与对象的关系 91 5.4 构造函数和析构函数 91 5.4.1 构造函数的概念及使用 92 5.4.2 析构函数的概念及使用 92 5.5 枚举 93 5.5.1 什么是枚举 93 5.5.2 枚举的...

    问答式OWL知识检索技术

    问答式检索以其符合普通用户行为习惯的输入输出模式、满意的准确度成 为信息检索技术中的研究热点,先后出现了:面向数据库的问答式检索技术、 面向Web的问答式检索技术、面向本体的问答式检索技术。但是,现有的问答...

    C++ Primer第四版【中文高清扫描版】.pdf

    16.2 实例化 535 16.2.1 模板实参推断 537 16.2.2 函数模板的显式实参 540 16.3 模板编译模型 542 16.4 类模板成员 545 16.4.1 类模板成员函数 548 16.4.2 非类型形参的模板实参 551 16.4.3 类模板中的友元声明 552 ...

    c#3.0语言规范高清PDF

    1.6.6.3 静态方法和实例方法 ................................................................................................................... 16 1.6.6.4 虚方法、重写方法和抽象方法 ......................

    C#微软培训资料

    7.4 关系操作符和关系表达式.65 <<page 2>> page begin==================== 7.5 逻辑操作符和逻辑表达式.68 7.6 位 运 算 .69 7.7 其它特殊操作符 .72 7.8 小 结 .77 第八章 流 程 控 制 .79 8.1 ...

Global site tag (gtag.js) - Google Analytics