关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范式
现简单介绍
1NF
(第一范式),
2NF
(第二范式),
3NF
(第三范式)和
BCNF
,另有第四范式和第五范式留到以后再介绍。
在你设计数据库之时,若能符合这几个范式,你就是数据库设计的高手。
第一范式(
1NF
):
在关系模式
R
中的每一个具体关系
r
中,如果每个属性值
都是不可再分的最小数据单位,则称
R
是第一范式的关系。例:如职工号,姓名,电话号码组成一个表(一个人可能有一个办公室电话
和一个家里电话号码)
规范成为
1NF
有三种方法:
一是重复存储职工号和姓名。这样,关键字只能是电话号码。
二是职工号为关键字,电话号码分为单位电话和住宅电话两个属性
三是职工号为关键字,但强制每条记录只能有一个电话号码。
以上三个方法,第一种方法最不可取,按实际情况选取后两种情况。
第二范式(
2NF
):
如果关系模式
R
(
U
,
F
)中的所有非主属性都完全依赖于任意一个候选关键字,则称关系
R
是属于第二范式的。
例:选课关系
SCI
(
SNO
,
CNO
,
GRADE
,
CREDIT
)其中
SNO
为学号,
CNO
为课程号,
GRADEGE
为成绩,
CREDIT
为学分。
由以上条件,关键字为组合关键字(
SNO
,
CNO
)
在应用中使用以上关系模式有以下问题:
a.
数据冗余,假设同一门课由
40
个学生选修,学分就
重复
40
次。
b.
更新异常,若调整了某课程的学分,相应的元组
CREDIT
值都要更新,有可能会出现同一门课学分不同。
c.
插入异常,如计划开新课,由于没人选修,没有学号关键字,只能等有人选修才能把课程和学分存入。
d.
删除异常,若学生已经结业,从当前数据库删除选修记录。某些门课程新生尚未选修,则此门课程及学分记录无法保存。
原因:非关键字属性
CREDIT
仅函数依赖于
CNO
,也就是
CREDIT
部分依赖组合关键字(
SNO
,
CNO
)而不是完全依赖。
解决方法:分成两个关系模式
SC1
(
SNO
,
CNO
,
GRADE
),
C2
(
CNO
,
CREDIT
)。新关系包括两个关系模式,它们之间通过
SC1
中的外关键字
CNO
相联系,需要时再进行自然联接,恢复了原来的关系
第三范式(
3NF
):
如果关系模式
R
(
U
,
F
)中的所有非主属性对任何候选关键字都不存在传递信赖,则称关系
R
是属于第三范式的。
例:如
S1
(
SNO
,
SNAME
,
DNO
,
DNAME
,
LOCATION
)
各属性分别代表学号,
姓名,所在系,系名称,系地址。
关键字
SNO
决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是
2NF
。但这关系肯定有大量的冗余,有关学生所在的几个属性
DNO
,
DNAME
,
LOCATION
将重复存储,插入,删除和修改时也将产生类似以上例的情况。
原因:关系中存在传递依赖造成的。即
SNO -> DNO
。
而
DNO -> SNO
却不存在,
DNO -> LOCATION,
因此关键辽
SNO
对
LOCATION
函数决定是通过传递依赖
SNO -> LOCATION
实现的。也就是说,
SNO
不直接决定非主属性
LOCATION
。
解决目地:每个关系模式中不能留有传递依赖。
解决方法:分为两个关系
S
(
SNO
,
SNAME
,
DNO
),
D
(
DNO
,
DNAME
,
LOCATION
)
注意:关系
S
中不能没有外关键字
DNO
。否则两个关系之间失去联系。
BCNF
:如果关系模式
R
(
U
,
F
)的所有属性(包括主属性和非主属性)都不传递依赖于
R
的任何候选关键字,那么称关系
R
是属于
BCNF
的。或是关系模式
R
,如果每个决定因素都包含关键字(而不是被关键字所包含),则
RCNF
的关系模式。
例:配件管理关系模式
WPE
(
WNO
,
PNO
,
ENO
,
QNT
)分别表仓库号,配件号,职工号,数量。有以下条件
a.
一个仓库有多个职工。
b.
一个职工仅在一个仓库工作。
c.
每个仓库里一种型号的配件由专人负责,但一个人可以管理几种配件。
d.
同一种型号的配件可以分放在几个仓库中。
分析:由以上得
PNO
不能确定
QNT
,由组合属性(
WNO
,
PNO
)来决定,存在函数依赖(
WNO
,
PNO
)
-> ENO
。由于每个仓库里的一种配件由专人负责,而一个人可以管理几种配件,所以有组合属性(
WNO
,
PNO
)才能确定负责人,有(
WNO
,
PNO
)
-> ENO
。因为
一个职工仅在一个仓库工作,有
ENO -> WNO
。由于每个仓库里的一种配件由专人负责,而一个职工仅在一个仓库工作,有
(
ENO
,
PNO
)
-> QNT
。
找一下候选关键字,因为(
WNO
,
PNO
)
-> QNT
,(
WNO
,
PNO
)
-> ENO
,因此
(
WNO
,
PNO
)可以决定整个元组,是一个候选关键字。根据
ENO->WNO
,(
ENO
,
PNO
)
->QNT
,故(
ENO
,
PNO
)也能决定整个元组,为另一个候选关键字。属性
ENO
,
WNO
,
PNO
均为主属性,只有一个非主属性
QNT
。它对任何一个候选关键字都是完全函数依赖的,并且是直接依赖,所以该关系模式是
3NF
。
分析一下主属性。因为
ENO->WNO
,主属性
ENO
是
WNO
的决定因素,但是它本身不是关键字,只是组合关键字的一部分。这就造成主属性
WNO
对另外一个候选关键字(
ENO
,
PNO
)的部
分依赖,因为(
ENO
,
PNO
)
-> ENO
但反过来不成立,而
P->WNO
,故(
ENO
,
PNO
)
-> WNO
也是传递依赖。
虽然没有非主属性对候选关键辽的传递依赖,但存在主属性对候选关键字的传递依赖,同样也会带来麻烦。如一个新职工分配到仓库工作,但暂时处于实习阶段,没有独立负责对某些配件的管理任务。由于缺少关键字的一部分
PNO
而无法插入到该关系中去。又如某个人改成不管配件了去负责安全,则在删除配件的同时该职工也会被删除。
解决办法:分成管理
EP
(
ENO
,
PNO
,
QNT
),关键字是(
ENO
,
PNO
)工作
EW
(
ENO
,
WNO
)其关键字是
ENO
缺点:分解后函数依赖的保持性较差。如此例中,由于分解
,
函数依赖(
WNO
,
PNO
)
-> ENO
丢失了
,
因而对原来的语义有所破坏。没有体现出每个仓库里一种部件由专人负责。有可能出现
一部件由两个人或两个以上的人来同时管理。因此,分解之后的关系模式降低了部分完整性约束。
一个关系分解成多个关系,要使得分解有意义,起码的要求是分解后不丢失原来的信息。这些信息不仅包括数据本身,而且包括由函数依赖所表示的数据之间的相互制约。进行分解的目标是达到更高一级的规范化程度,但是分解的同时必须考虑两个问题:无损联接性和保持函数依赖。有时往往不可能做到既有无损联接性,又完全保持函数依赖。需要根据需要进行权衡。
1NF
直到
BCNF
的四种范式之间有如下关系:
BCNF
包含了
3NF
包含
2NF
包含
1NF
小结:
目地:规范化目的是使结构更合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新
原则:遵从概念单一化
"
一事一地
"
原则,即一个关系模式描述一个实体或实体间的一种联系。规范的实质就是概念的单一化。
方法:将关系模式投影分解成两个或两个以上的关系模式。
要求:分解后的关系模式集合应当与原关系模式
"
等价
"
,即经过自然联接可以恢复原关系而不丢失信息,并保持属性间合理的联系。
注意:一个关系模式结这分解可以得到不同关系模式集合,也就是说分解方法不是唯一的。最小冗余的要求必须以分解后的数据库能够表达原来数据库所有信息为前提来实现。其根本目标是节省存储空间,避免数据不一致性,提高对关系的操作效率,同时满足应用需求。实际上,并不一定要求全部模式都达到
BCNF
不可。有时故意保留部分冗余可能更方便数据查询。尤其对于那些更新频度不高,查询频度极高的数据库系统更是如此。
在关系数据库中,除了函数依赖之外还有多值依赖,联接依赖的问题,从而提出了第四范式,第五范式等更高一级的规范化要求。在此,以后再谈。
各位朋友,你看过后有何感想,其实,任何一本数据库基础理论的书都会讲这些东西,考虑到很多网友是半途出家,来做数据库。特找一本书大抄特抄一把,各位有什么问题,也别问我了,自已去找一本关系数据库理论的书去看吧,说不定,对各位大有帮助。说是说以上是基础理论的东西,请大家想想,你在做数据库设计的时候有没有考虑过遵过以上几个范式呢,有没有在数据库设计做得不好之时,想一想,对比以上所讲,到底是违反了第几个范式呢?
我见过的数据库设计,很少有人做到很符合以上几个范式的,一般说来,第一范式大家都可以遵守,完全遵守第二第三范式的人很少了,遵守的人一定就是设计数据库的高手了,
BCNF
的范式出现机会较少,而且会破坏完整性,你可以在做设计之时不考虑它,当然在
ORACLE
中可通过触发器解决其缺点。以后我们共同做设计之时,也希望大家遵守以上几个范式。
----------------------------------------------------------------------------------------------------------------------
构成键码(或候选码)的属性称为主属性
,而其它属性称为非主属性
1.
函数依赖定义
设:R(U)
是属性集U
上的关系模式,X
,Y
⊆
U
。如果对于R(U)
的任意一个关系r
,以及r
的任意两个元组t1
,t2
,不存在:t1[x]=t2[x]
,而t1[Y]≠t2[Y]
,则称X
函数决定Y
,或者说Y
函数依赖于X
。记为:X→Y
。
1
)“X→Y”
必须对R
(U
)的任何一个关系实例都成立。
2
)若X→Y
, Y→X
,则记作X←→Y
。若Y
不函数依赖X
,则记作X Y
。
3
)函数依赖是现实世界数据关联的表现形式。
2.
完全函数依赖与部分函数依赖
1)
定义完全函数依赖:在R(U)
中,如果X→Y
,且对X
的任何一个真子集X’
,都有X’ Y
,则称Y
对X
完全函数依赖,记作:
)
2)
定义部份函数依赖:在R(U)
中,如果X→Y,
但Y
不完全函数依赖X
,则称Y
对X
部份函数依赖,记作
。
3.
传递函数依赖定义:
在R(U)
中,如果X→Y
,Y X
( Y
⊆
X
),Y→Z
,则称Z
传递函数依赖于X
,记为X t Z
。
4.
数据库中的范式:
关系数据库的任意一个关系,需要满足一定的数据依赖约束。满足不同程度数据依赖约束的关系,称为不同范式的关系。
第一范式:
关系模式的各属性域是“
原子”
的
第二范式:
设R
是一个关系模式。若R∈1NF
,且每一个非主属性完全函数依赖于码,则R∈2NF
第三范式:
如果关系模式R
(U
,F
)是2NF
的,且不存在键码X
、属性组Y
以及非主属性Z
,使得X→Y
,Y→Z
成立,则R∈3NF
,换句话说就是若R∈3NF
,则R
中不存在非主属性对码的传递函数依赖。
BCNF
:
关系模式R
∈1NF
。如果对于R
的每一个函数依赖X
→Y
(Y
⊆
X
),X
都含有键码(即X
是超码),那么R
∈BCNF
。
第四范式:
设关系模式R
∈1NF
。若对于R
的每个非平凡多值依赖X
→→Y
(Y
⊆
X
),X
都含有键码,则R
∈4NF
5.
几个问题的总结:
a)
第二范式与BCNF
的区别:
第二范式只要求非主属性对码的完全依赖,而BCNF
还要求主属性对不包
含它的键码的完全依赖。
b)
第三范式与BCNF
的区别:
第三范式没有像BCNF
那么严格,它只要求主属性对不包含它的键码的部
分依赖。
c)
第三范式的定义(来自《数据库系统基础教程》)是若在关系R
中存在非平凡的FD
且要么是{
}
是超键,要么B
属于某个键,怎么能推出R
中不存在非主属性对码的传递函数依赖?
首先键码不能决定键码,由定义可以看出,当B
是非主属性,一定由其中一个键码决定,所以不会有对码的传递依赖。
6.
规范化目的:
减小关系模式因规范化程度过低带来的数据冗余,克服修改、删除的异常,
“模式分解”是规范化的实现途径,但数据库设计实践中不能过分追求规范化程度
分享到:
相关推荐
本文档旨在深入浅出 MySQL 数据库开发、优化与管理维护的知识点,涵盖了 MySQL 数据库开发的基本概念、优化技巧和管理维护方法。 数据库开发篇 在本篇中,我们将学习 MySQL 数据库开发的基础知识,包括数据类型、...
"深入浅出SQL Server数据库开发随书光盘"是针对该系统的一款配套学习资源,包含了与书中理论知识相辅相成的实践代码。通过这本书和光盘中的内容,读者可以深入理解SQL Server的各个方面,包括但不限于数据库设计、...
本文将深入探讨数据库设计的一些重要技巧,帮助程序员提升在这一领域的专业技能。 一、概念理解 1. 数据库模式:数据库模式是数据库结构的逻辑表示,包括实体、属性、关系和约束。理解并掌握ER模型(实体-关系模型...
2. **系统学习过数据结构但缺乏实战经验的程序员**:这类程序员倾向于严格按照教科书上的规范设计数据库,如E-R图和第三范式(3NF)等。虽然能满足一般需求,但随着应用的发展,可能会面临较大的调整压力。 3. **...
它不仅深入浅出地介绍了数据库设计的基本概念,还提供了实用的技巧和最佳实践,帮助读者在实际项目中解决复杂的数据存储和管理问题。通过阅读和实践,读者可以提高自己在数据库设计领域的专业素养,为构建高效、可靠...
这本书深入浅出地介绍了如何有效地构建和管理数据库,尤其关注MySQL和Oracle这两种广泛使用的数据库管理系统。 首先,书中详细阐述了数据库设计的基本概念,包括数据模型的类型,如关系模型,这是大部分数据库系统...
数据库设计是IT领域中的核心概念,它涉及到如何有效地组织、存储和检索数据。这份名为"数据库设计PPT——教学用的"的资源是为学习者准备...它覆盖了从概念到实现的全过程,深入浅出,适合初学者和有一定基础的学习者。
《深入浅出MySQL使用手册》是一本针对MySQL数据库系统的学习指南,主要涵盖了从基础到进阶的全方位内容。本手册特别适用于初学者以及希望提升MySQL技能的后端开发者和数据库管理员。书中详细介绍了MySQL 5.1版本,这...
《深入浅出SQL(中文版)》是一本旨在帮助读者全面理解并熟练掌握SQL语言的专业教程。SQL,全称为Structured Query Language(结构化查询语言),是数据库管理与数据操作的核心工具,广泛应用于各类数据存储系统中。这...
数据库设计是另一重要知识点,它涉及到关系模型、ER图(实体关系图)以及范式理论。学生需要学习如何将现实世界的问题转化为数据结构,并通过规范化处理减少数据冗余,提高数据的一致性和完整性。此外,索引的建立、...
总之,梁敬彬大师的《赢在起点-数据库设计规范》深入浅出地讲解了数据库设计的关键点,对于从事Oracle、MySql、DB2数据库工作的专业人士,是不可多得的学习资料。通过理解和应用这些规范,可以提高数据库的稳定性和...
3. **中级设计者**:这一级别的设计师能够根据实际需求平衡数据冗余和效率,设计出可扩展的数据库结构,适配中等规模的商业系统。他们会适时引入冗余数据以提高查询效率。 4. **高级设计者**:这类设计师具有前瞻性...
5. **数据库管理系统开发者**:这类程序员不仅精通数据库设计,还深入研究各种DBMS的内部机制,能够进行二次开发或者自行开发新的数据库管理系统。 #### 五、树型关系的数据表设计技巧 树型结构在数据库设计中非常...
这本书的第三版通常被众多高校选为计算机专业的必修课程教材,其内容深入浅出地介绍了数据库的基本概念、设计方法以及管理技术。然而,正如描述中所提到的,教材的课后习题往往缺乏官方答案,这使得学生在自我检验和...
综上所述,“深入浅出系列\SQL\分章节\04- Smart Table Design Why be normal.pdf”这部分内容主要讲述了数据库规范化的基本原理以及如何运用这些原理进行智能表设计,包括规范化的基本概念、不同范式的介绍以及智能...
《数据库系统原理与设计》是数据库领域的一本经典教材,由万常选教授编写,它深入浅出地讲解了数据库的基础理论、设计方法以及实践应用。这个压缩包包含的资源是该书的所有练习题及其详尽解答,对于学习者来说是宝贵...
### C#深入浅出全接触 #### 一、C#简介 C#是一种由微软公司开发的现代化编程语言。作为一种衍生自C和C++的编程语言,C#继承了C++的强大功能,同时具备像VB一样的简洁易用性。对于Web开发而言,C#与Java相似,但在...
不过,根据文件标题“深入浅出 SQL(中文版)”可以推测,这本书可能是一本关于SQL语言的入门和进阶指导书籍。 由于无法直接从提供的内容中生成知识点,我将根据标题所暗示的潜在主题,尝试构建一份与SQL相关的知识点...