-
7
章
关
系
数
据
库
< br>的
规
范
化
关系:描述实体、属性、实体间的联系。
从形式上看,它是
一张二维表,是所涉及属性的笛卡尔积的一个子集。
关系模式:用来定义关系。
关系数据
库:基于关系模型的数据库,利用关系来描述现实世界。
从形式上看,它由一组关系组成。
关系数据库的模式:定义这组关系的关系模式的全体。
关系模式的形式化定义
:
关系模式由五部分组成,即它是一个五元组:
R(U, D, DOM, F)
R
:
关系名
U
:
组成该关系的属性名集合
D
:
属性组
U
中
属性所来自的域
DOM
:属性向域的映象集合
F
:
属性间数据的依赖关系集合
设
计
branch = (branch_name, branch_city,
assets)
customer = (customer_id,
customer_name, customer_street, customer_city)
account = (account_number, balance)
employee = (employee_id. employee_name,
telephone_number, start_date)
dependent_name = (employee_id, dname)
account_branch
= (account_number, branch_name)
loan_branch
= (loan_number,
branch_name)
loan
= (loan_number, amount)
borrower
=
(customer_id, loan_number)
depositor = (customer_id,
account_number)
cust_banker = (customer_id,
employee_id, type)
works_for =
(worker_employee_id, manager_employee_id)
payment = (loan_number, payment_number,
payment_date, payment_amount)
savings_account = (account_number,
interest_rate)
checking_account =
(account_number, overdraft_amount)
组合模式(左)(
Combine Schemas
)将
borrower
模式和
loan
模式相连接为
bor_loan
< br>模式
bor_loan =
(customer_id, loan_number, amount )
其结果可能导致重复
(
为该贷款的团体中的每个客户重复一次贷款数额
L-100
< br>)
三图:
p174-p175
考虑组合(中)
loan_branch= (loan_number,
branch_name)
和
loan = (loan_number, amount)
loan_amt_br = (loan_number,
amount, branch_name)
没有重复,故选择联系的时候要选
1
对多
设计选择
更小的模式:(右)
假定我们以开始时候得到的是
bor
_loan
模式
.
如何知道将它分解成
(decompose)
borrower
和
loan
模式
?
需要写出这样一条规则
“如果存在模式
(loan_number,
amount),
那么
loan_number
将作为
候选键”
上述规则称为函数依赖(
functional
dependency
)
:
loan_number
amount
在
bor_loan =
(customer_id, loan_number, amount
)
中
,
因为
loan_number
不是候选键,
所以
loan
的
amount
可能会重复
.
这表明有必须分解
bor_loan.
并非所有的分解都是好的。假定我们把<
/p>
employee
分解为:
employee1 = (employee_id,
employee_name)
employee2 =
(employee_name, telephone_number, start_date)
这个分解的缺陷在于企业中可能存在两个同名的雇员
下一个
PPt
将显示我们损失的信息
–
我们不能重构原来的
employee
relation
关系
–
因
此,这是一个有损分解(
lossy
decomposition
)
.
关系数据理论:
< br>数据库设计的一个最基本的问题是如何建立一个好的数据库模式。
即给出一组数据,如何构造一个适合于它们的数据模式,使数
据库系统无论是在数据
存储方面,还是在数据操纵方面都有较好的性能。
E-R
模型方法讨论了实体与实体之间的数据联系,
现在来讨论实体内
部属性与属性之
间的
关系数据理论
数据
关联,目标是要设计一个“好”的数据库模型。
问题提出:
在解决如何设计一个好的数据库模式之前,先看一
看什么是
“不好”
的数据库设计
< br>(关
系数据库模式可能出现的异常)。
例:建立一个关系数据库来描述学生的一些情况,
该数据库只包含一个关系模式:
学生(学号,姓
名,系名,系主任,课程,成绩)
存在的问题:
i.
数据冗余:姓名,系名,系
==
〉重复出现。
ii.
更新异常:某一元组修改系主任,其
他不变
==
〉同一系,系主任不同,造成了数据潜在的
不一致性。
iii.
插入异常:系刚成立,尚未招收学生,主关键字为空,则系主任、选的课都无法存入数
据库,未选课的学生信息也无法存入。
删除异常:一个系的学
生毕业了,删除这些学生的记录,则系主任等信息也删除掉了。
产生异常的原因:
这些异常的产生主要是因为关系模
式的结构,
即关系模式中的属性之间存在过多的数
据依赖关系,
与现实世界不符合。
注:数据依赖关系——最重要的一类是函数依赖。
·
主关键字(学号
< br>+
课程)一定,元组就确定了,元组分量也就确定了,即
所有其它属性都依赖于
“学号”和“课程”。
·
但实际:学号→姓名,不需选课。
系名→系主任。
解决:
分解为三个新的关系模式:
学生(学号,姓名,系名)
成绩(学号,课程,成绩)
系(系名,系主任)
p>
这样上面提到的问题不存在了,将学生、成绩和系三个相对独立的实体划分开来,使
之更符合现实世界的实际。
目标:
—设计一套理论
能确定一个特定的关
系
R
是一个“好的”形式
.
如果一个关系
R
不是一个“好的”形式
,
将它分解为关系集
{R1, R2,
..., Rn}
其中
每个关系是一个好的形式
分解是无损连接分解(
lossless-join
decomposition
)
理论
:
函数依赖(
functional
dependencies
)
多值依赖(
multivalued
dependencies
)
函数依赖:
某个属性集决定另一个属
性集时,称另一属性集依赖于该属性集
只要有
u[X]=v[X]
,就有
u[Y]=v
[Y]
,则称
X
函数决定
Y
,或称
Y
函
数依赖于
X
,记为
X→Y。
在合法关系集上的约束
.
函数——熟悉的概念。
Y=f(x)
:
x
和
Y
之间数量上的对应关系。给
定
x
值,
Y
值
与之对应。称
x
函数决定
Y
,或
Y
函数依赖于
x
。
在关系数据库中讨论函数或函数依赖注重的是语义上的关系。
p>
如:省
=f(
城市
)
要求某些属性集的值唯一决定其他属性集的值
函数依赖是键
(
码)的更一般化的说法
.
R
是一个关系模式
:
函数依赖:
在
R
p>
上成立(
holds on
)当且仅当任
何合法的关系
r(R)
及
r
中任何两个元组
t1
和
t2,
如果
t1[A] = t2 [A]
(则)
t1[B]
= t2 [B]
现实世界的每一实体集合,都有一
关键字(码),即唯一确定各个实体的一组属性。同样,
关系上最重要的约束是关系的关
键字约束,即关键字
/
码唯一确定关系的元组。
1.
候选键(
Candidate
Key
)与主键(
Primary
Key
)
2.
外部键(
Foreign
Key
)
(
右上的图
)
注:主码与外码(主关键字与外关键字)提供了一个表示关系间联系的手段。
使用函数依赖
函数依赖可以让我们表达不能用超键表达的约束依赖,考虑到模式
:
bor_loan =
(customer_id, loan_number, amount ).
我们期望如下函数依赖成立
:
loan_number-> amount
但不希望下面的函数依赖成立
:
amount -> customer_name
使用函数依赖
:
用于判断关系在给定的函数依赖集上是否合法
.
如果一个关系
r
在函数依赖集
F
上合法,则称
r
满足(
satisfies
)
F.
用于定义合法关系集上的约束
如果在
模式
R
上所有的合法关系都满足函数依赖集
F,
我们说
F
在
R
上成立(
hold
)
.
注意
:
关
系模式上的一个特定实例可以满足一个函数依赖,即使该函数依赖不能在所有合
法的实例
上成立。
例如
,
一个特定的
loan
实例可能偶尔满足
:
amount->customer_name.
一个函数依赖被称为平凡的(
tri
vial
),因为他们在所有的关系中都是满足的
例如
:
customer_name, loan_number ->
customer_name
customer_name
-> customer_name
函数依赖集的闭包
给定一个函数依赖集
F
,
其他的一些函数依赖逻辑蕴含在
F
内
。形式
化地说,给定关系
模式
R
,如果每一个
满足
F
的关系实例
r(R)
也满足
f
,则
R
上的函数依赖
f
被
R<
/p>
上的函数依
赖集
F
逻辑蕴涵
.
例如
:
If
A-> B
且
B-> C,
那么我们可以推导出
A-> C
F
的闭包(
closure)
是指
F
逻辑蕴涵的所有函数依赖的集合
.
闭包表示为
F+.
F+
是
F
的超集
.
范式
在关系数据模式设计中,
为了避免由依赖引起的数据的冗余和更新异常问题,
必须进行关系
p>
数据模式的规范化。
2
范式
若关
系模式
R
∈
1NF
,并且每一个非主属性都完全函数依赖于
R
的键,则
R
∈
2NF
反例:
例:库存(仓库号,设备号,数量,地点)
1NF
,但非
2NF
。
非主属性数量完全依赖于关键字。
非主属性地点部分依赖于关键字。
即有仓库号→地点。
(仓库号,设备号)→地点。
出现的问题:
一个仓库若只有一种设备,则删除设备→删除仓库。
·学生关系:
学生(
学号,姓名,系名,系主任
,
课程,成绩)
不是
2NF
。
只有成
绩完全函数依赖于键,姓名、系名、系主任对键部分依赖,因为它
们由学号可决定。
p>
采用投影分解法将一个
1NF
的关系分解为多个
2NF
的关系,可以在一定程度上减轻原
1NF
关系中存在的插入异
常、删除异常、数据冗余度大、修改复杂等问题。
例子:⑴库存(仓库号,设备号,数量)
仓库(仓库号,地点)
⑵学生记录(学号,姓名,系名,系主任)
p>
r(
学生记录
)=
Π
(学号,姓名,系名,系主任)(
r
’
(
学生
)
)
成绩(学号,课程,成绩)
r(<
/p>
成绩
)=
Π
<<
/p>
学号,课程,成绩
>
(
< br>r
’
(
学生
)
)
将一个
1NF
关系分解为多个
2NF<
/p>
的关系,并不能完全消除关系模式中的各种异常情况和数
据冗余<
/p>
BC
范式
具
有函数依赖集
F
的关系模式
R
是
BCNF
的条件是:
对所有
F+
中形如
A->B
的函数依赖
(
AC R
BC
R
)
,
下面至少有一个成立
:
不是
BCNF
的例子
:
bor_loan = ( customer_id,
loan_number, amount )
因为
loan_number
amount
在
bor_loan
上成立,但
loan_number
不是超键
BCNF
一个等价描述:每个非平凡
F
D
的左边必须包含键
㈡
举例及讨论:
例:⑴
.
管理(仓库号,设备号,职工号)非
BCNF
(3NF)
。
语义
:
①
.
一个仓库可有多个职工;
②
.
p>
一名职工仅在一个仓库工作;
p>
③
.
在每个仓库,一种设备仅由一名职工保
管
但每名职工可以保管多种设备)。
根据语义有依赖:职工号→仓库号;
(仓库号,设备号)→职工号;
问题:·新职工分到一仓库,尚未负责设备,则不能插入。
·插入异常:同一设备,两个职工
,无法防止这样插入,与③违背。
Boyce-Codd
范式具有的性质
1.
所有非主属性都完全函数依赖于每个候选键
2.
p>
所有主属性都完全函数依赖于每个不包含它的候选键
3.
没有任何属性完全函数依赖于非键的任何一组属性
将一个模式分解成
BCNF
假定模式
R
有一个非平凡的依赖关系
,违反了
BCNF.
我们把
R
分解为
:
在我们的例子中
,
= loan_number
= amount
那么
bor_loan = ( customer_id,
loan_number, amount )
被替换为
(
U
) = ( loan_number, amount )
( R - (
贝塔
-
阿尔法
) ) = ( customer_id, loan_number )
BCNF
和保持依赖
1
约束,包括函数依赖,在实际检验这些约束时开销很大,除非在检查函数依赖的时候仅仅
只需要考虑一个关系
,
那么检查这种约束的开销就很低(分解-开销上升)。
2
如果只需要在分解的每个关系上测试这些依赖就能确信所有的函数依
赖成立的话,
那么这
样的分解就是保持依赖的(
dependency
preserving
)
3
因为并非总是能够得到
BCNF
和依赖保持,我
们考虑一个弱的范式,称为第三范式
-
-
-
-
-
-
-
-
-
上一篇:erp专业术语英文缩写
下一篇:航海用语