一、数据建模
数据库的设计不仅需要处理规则的理解,更重要的是数据需求的理解与表达。
表达计算机世界的模型称为数据模型,而表达信息世界的模型称为概念模型。抽象是具有层次的,将现实世界的问题抽象成概念模型,就是数据建模的过程,而将概念模型抽象成数据模型的过程,就是数据库设计的过程。
1.1 实体-联系模型
实体-联系【Entity-Relationship,E-R】数据模型用于描述概念模型,其基本观点为:世界是由一组称作实体的基本对象和这些对象之间的联系组成。
实体是现实世界可区分于所有其他对象的一个对象。实体有类和个体的区分,一般称个体的实体为实例,而一类实体称为实体集。
实体使用属性来刻画,其是实体所具有的某一方面特性;实体的型刻画了一个实体,而实体的值刻画了一个实例。属性可以具体的分为:
-单一属性与复合属性,根据属性值的复合情况,如家庭住址由省份、市区等复合而成;
-单值属性与多值属性,根据属性值的数量情况,如一个人可能具有多个联系方式;
-可空属性与非空属性,根据属性值的可空情况;
-原始属性与导出属性,根据属性值是否可由其他属性导出,如年龄可以由出生年份导出。
实体还具有一个唯一区分每一实例的属性或其集合,称为码。
联系是指多个实体之间的相互关联。实体是相对稳定的,但是联系是多样化的。
参与发生联系的实体的数目,称为联系的度或元,例如两个实体之间的相互联系称为二元联系。较为特殊的,一元联系是指实体本身的联系,例如零件之间的装配关系。
实体在练习中扮演的功能称为实体的角色,当同一实体的不同实例参与一个联系时,为区别实例参与联系的方式,需要显式指明其角色。例如在零件的一元联系中,虽然零件之间均是装配关系,但仍需指明不同零件的父件与子件关系。
此外,在多元联系中,还要区分联系的对应关系,这种区分描述了联系的基数,是指一个实体的实例通过一个联系能与另一实体中相关联的实例的述目。包括:
-一对一联系,实体A的一个实例只与实体B的一个实例发生联系,且反之,实体B的一个实例也只与实体A的一个实例发生联系。例如一个经理经营一个商店,而一个商店也只有一个经理;
-一对多联系,实体A的一个实例与实体B的多个实例发生联系,但反之,实体B的一个实例只与实体A的一个实例发生联系。例如一个画家绘制多幅作品,但一幅作品只由一个画家绘制;
-多对多联系,实体A的多个实例与实体B的多个实例发生联系,且反之,实体B的多个实例也与实体A的多个实例发生联系。例如一个学生可以选修多门课,而一门课也可以被多个学生选修。
进一步,联系的基数还要区分零个、一个、不定多个与固定多个,通常以实体参与联系的最小和最大基数来标记,记为
(
M
i
n
C
a
r
d
.
.
.
M
a
x
C
a
r
d
)
(MinCard...MaxCard)
(MinCard...MaxCard),例如书架参与存放的图书的基数为
(
0...
m
)
(0...m)
(0...m),而图书参与书架联系的基数为
(
1...1
)
(1...1)
(1...1),其语义为一个书架可以存放0或多本书,而一本书只可以存放在1个书架中。并由此定义联系的参与概念:实例至少有一个参与到联系中,称为完全参与联系,其基数为
(
1...
m
)
(1...m)
(1...m);而实例可以不参与联系,称为部分参与联系,其基数为
(
0...
m
)
(0...m)
(0...m)。其意义为当联系为部分参与联系时,关系中就会允许出现空值。
1.2 实体-联系图
E-R图可以图像化表示数据库的全局逻辑结构。较为基础的是Chen方法,包括如下几个主要构件:
-矩形,代表实体;
-椭圆,代表属性。其中,如果出现多值属性和导出属性,则使用双线椭圆与虚线椭圆。属性中的码使用下划线,如果出现复合码,则使用相同的数字标记;
-直线,表示实体与属性的关联;
-菱形,代表联系。其中,使用从联系指向实体的单箭头表示1:1联系,使用从联系指向1端的单箭头及指向多端的直线表示1:m联系,使用直线表示m:n联系,或使用实体的数字标记表明联系的基数;使用单直线表示完全参与联系,使用双直线表示部分参与联系,或使用实体的数字标记表明联系的基数。
考虑一个图书管理模型,实体为读者、图书、书架,联系为借阅、保存,其E-R图为
此外,还有Crow’s foot方法,其区别于Chen方法,主要构建如下:
-双矩形框,代表实体及其属性。实体名称位于上矩形框,属性位于下矩形框,属性中的键使用下划线;
-菱形,代表联系,联系的菱形可以省略。其基数使用不同的连接线形象的表示,或使用实体的数字标记表明联系的基数。
那么上述图书管理模型的例子还可以表述成
1.3 IDEF1x
IDEF1x是一种数据建模方法,美国ICAM【Integrated Computer Aided Manufacturing】计划为项目规范化管理提出的一系列项目表述方法的IDEF【ICAM Definition】标准之一。IDEF1x是将E-R模型扩充语义含义而形成的。
实体表示现实和抽象事务的集合,集合的元素是实体的一个实例,在IDEF1x中,实体区分为独立实体,又称为强实体,独立实体的实例被唯一标识而不决定于与其他实体的联系;以及从属实体,又称为弱实体,从属实体的唯一标识需要依赖于与其他实体的联系。例如HIT001号合同具有item1、item2条目,而HIT002号合同也具有item1、item2条目,那么合同号是独立实体,而条目号依赖于合同号,是从属实体。独立实体与从属实体的IDEF1x的图示分别为
其中,矩形上侧标记主键,下侧使用AK n标记确定唯一标识的候选键。
联系是实体之间的一种连接关系,分为标定联系,其表示子实体的实例都是由其与父实体的联系而确定,父实体的主键是子实体主键的一部分,例如上述合同实例,就是一种标定联系,其IDEF1x使用实线连接,图示为
以及非标定联系,其表示子实体的实例被唯一标识而不依赖其他实体,父实体的主键不是子实体的主键,例如合同的合同号与签署合同的顾客号,一个合同号与顾客号存在联系,但不存在依赖关系,对于一个顾客可以签订多个合同,其IDEF1x使用虚线连接,图示为
以及非确定联系,表示实体之间的多对多的联系,采用引入相关实体来分解为若干个一对多的联系,例如一位读者可以借阅多本书,一本书可以被多位读者借阅,为了避免多对多的关系表达,引入借阅号实体,使得书号与读者号唯一标识一个借阅号。
此外,还有一种分类联系,其表示一个实体的实例是由一个一般实体实例及多个分类实体实例构成,例如一个学生可以分为研究生与本科生,这两类学生具有部分相同的属性的同时,还具有各自的属性,其IDEF1x图示为
对于实体的实例集,某些实例子集具有区别于其他实例的特性,从而可以进一步分类,这一过程称为具体化,而根据若干个实体共有的性质,可以合成较高层次的实体,这一过程称为泛化。高层实体的属性会被低层实体自动继承。当实体可以由全体分类实例组成,那么这种联系称为完全分类联系,而不能组成的称为非完全分类联系。例如学生或者是本科生,或者是研究生,必为二者之一,即完全分类联系。在IDEF1x图示中,双线表示完全分类,而单线表示非完全分类。
二、数据库设计
数据库的设计分为四个阶段:
-需求分析,目标是理解业务过程与数据处理流程、理解数据处理的性能需求,形成数据库设计的源与属性及其相关的详细描述,尤其是注意业务规则与属性处理规则;
-概念数据库,目标是对信息源进行抽象,发现属性之间的内在本质联系,并用标准的表达方法,如E-R模型或IDEF1X模型进行描述;
-逻辑数据库,目标是使用指定DBMS要求的模式描述方法,给出数据库的逻辑模式描述,最终用关系模型等描述方法进行描述;
-物理数据库,目标是结合DBMS物理数据库管理方法,给出最终的概念数据库的物理模式描述。
在上述流程的基础上,数据库设计过程中还需要遵循一定的设计理论原则。
2.1 数据依赖理论
设
R
(
U
)
R(U)
R(U)是属性集合
U
=
(
A
1
,
A
2
,
.
.
.
,
A
n
)
U = (A_1, A_2, ..., A_n)
U=(A1,A2,...,An)上的一个关系模式,
X
,
Y
⊆
R
X, Y \subseteq R
X,Y⊆R,若对于
R
R
R中的任意一个可能的关系
r
r
r,
r
r
r中不可能两个元组满足在
X
X
X的属性值相等而在
Y
Y
Y中的属性值不等,则称
Y
Y
Y函数依赖于
X
X
X,记作
X
→
Y
X \rightarrow Y
X→Y。典型的,一个属性集合包含学生的学号、姓名、年龄等,当两个实例的学号相同时,其姓名、年龄一定相同,即不可能有相同学号的实例,其姓名与年龄不同,称姓名函数依赖于学号。
设
R
(
U
)
R(U)
R(U)是属性集合
U
=
(
A
1
,
A
2
,
.
.
.
,
A
n
)
U = (A_1, A_2, ..., A_n)
U=(A1,A2,...,An)上的一个关系模式,有
X
→
Y
X \rightarrow Y
X→Y且
∀
X
′
⊂
X
\forall X' \subset X
∀X′⊂X,都有
X
′
↛
Y
X' \not\rightarrow Y
X′→Y,则称
Y
Y
Y完全函数依赖于
X
X
X,记为
X
→
f
Y
X \rightarrow^f Y
X→fY,否则称为
Y
Y
Y部分函数依赖于
X
X
X,记为
X
→
p
Y
X \rightarrow^p Y
X→pY。典型的,一个属性集合包含学生的学号、姓名、年龄、课程号与成绩,那么成绩完全依赖于学号与课程号的二元集合,而姓名仅依赖于学号,故部份依赖于学号与课程号的二元集合。
设
R
(
U
)
R(U)
R(U)是属性集合
U
=
(
A
1
,
A
2
,
.
.
.
,
A
n
)
U = (A_1, A_2, ..., A_n)
U=(A1,A2,...,An)上的一个关系模式,有
X
→
Y
X \rightarrow Y
X→Y,
Y
→
Z
Y \rightarrow Z
Y→Z,则称
Z
Z
Z传递依赖于
X
X
X。典型的,一个属性集合包含学生的学号、班号、班长,那么学号决定班号,班号决定班长,即班长传递依赖于学号。
设
R
(
U
)
R(U)
R(U)是属性集合
U
=
(
A
1
,
A
2
,
.
.
.
,
A
n
)
U = (A_1, A_2, ..., A_n)
U=(A1,A2,...,An)上的一个关系模式,
K
⊆
R
K \subseteq R
K⊆R,若
K
→
f
U
K \rightarrow^f U
K→fU,那么
K
K
K就是
R
R
R上的候选键。若
R
R
R的属性组合
X
X
X不是
R
R
R的候选键,却是另一关系
S
S
S的候选键,则是
R
R
R的外键。
设
R
(
U
)
R(U)
R(U)是属性集合
U
=
(
A
1
,
A
2
,
.
.
.
,
A
n
)
U = (A_1, A_2, ..., A_n)
U=(A1,A2,...,An)上的一个关系模式,
F
F
F是
R
R
R的一个函数依赖集合,记为
R
(
U
,
F
)
R(U, F)
R(U,F),
X
,
Y
⊆
R
X, Y \subseteq R
X,Y⊆R,若根据
F
F
F的函数依赖可以得到
X
→
Y
X \rightarrow Y
X→Y,则称
F
F
F逻辑蕴含
X
→
Y
X \rightarrow Y
X→Y。被
F
F
F逻辑蕴涵的所有函数依赖集合称为
F
F
F的闭包,记作
F
+
F^+
F+。若
F
+
=
F
F^+ = F
F+=F,则称
F
F
F是一个函数依赖完备集合。函数依赖具有阿姆斯特朗【Armstrong】公理:
-若
Y
⊆
X
⊆
U
Y \subseteq X \subseteq U
Y⊆X⊆U,则
X
→
Y
X \rightarrow Y
X→Y被
F
F
F逻辑蕴含;
-若
X
→
Y
∈
F
X \rightarrow Y \in F
X→Y∈F,且
Z
⊆
U
Z \subseteq U
Z⊆U,则
(
X
,
Z
)
→
(
Y
,
Z
)
(X,Z) \rightarrow (Y,Z)
(X,Z)→(Y,Z)被
F
F
F逻辑蕴涵;
-若
X
→
Y
∈
F
X\rightarrow Y \in F
X→Y∈F,且
Y
→
Z
Y \rightarrow Z
Y→Z,则
X
→
Z
X \rightarrow Z
X→Z被
F
F
F逻辑蕴涵。
设
R
(
U
)
R(U)
R(U)是属性集合
U
=
(
A
1
,
A
2
,
.
.
.
,
A
n
)
U = (A_1, A_2, ..., A_n)
U=(A1,A2,...,An)上的一个关系模式,
X
⊆
U
X \subseteq U
X⊆U,令
X
F
+
=
{
A
i
∣
X
→
A
i
}
X^+_F = \{A_i|X\rightarrow A_i\}
XF+={Ai∣X→Ai},称
X
F
+
X^+_F
XF+是
X
X
X关于
F
F
F的属性闭包。显然,有
X
⊆
X
F
+
X \subseteq X^+_F
X⊆XF+,且若
X
→
Y
X \rightarrow Y
X→Y,则
Y
⊆
X
F
+
Y \subseteq X^+_F
Y⊆XF+。
对
R
(
U
)
R(U)
R(U)上的两个函数依赖集合
F
F
F与
G
G
G,若
F
+
=
G
+
F^+=G^+
F+=G+,则
F
F
F与
G
G
G是相互覆盖的。计算属性集
U
U
U的子集
X
X
X关于函数依赖集合
F
F
F的属性闭包,步骤如下:
1.令
X
(
0
)
=
X
,
i
=
0
X^{(0)}=X, i = 0
X(0)=X,i=0;
2.令
B
=
{
A
∣
V
→
W
∈
F
∧
V
⊆
X
(
i
)
∧
A
⊆
W
}
B = \{A|V \rightarrow W \in F \wedge V \subseteq X^{(i)} \wedge A \subseteq W\}
B={A∣V→W∈F∧V⊆X(i)∧A⊆W};
3.令
X
(
i
+
1
)
=
B
∪
X
(
i
)
X^{(i+1)} = B \cup X^{(i)}
X(i+1)=B∪X(i);
4.若
X
X
X有更新,则迭代2~3,知道
X
X
X收敛,即为
X
F
+
X^+_F
XF+。
2.2 关系范式理论
若关系模式
R
(
U
)
R(U)
R(U)中,关系的每个分量都是不可分的数据项,则称
R
(
U
)
R(U)
R(U)属于第一范式,记作
R
(
U
)
∈
1
N
F
R(U) \in 1NF
R(U)∈1NF。例如关系
S
t
a
r
(
N
a
m
e
,
A
d
d
r
(
s
t
r
e
e
t
,
c
i
t
y
)
)
Star(Name, Addr(street, city))
Star(Name,Addr(street,city))不属于第一范式,因为属性
A
d
d
r
Addr
Addr包含两个属性。第一范式要求关系不存在复合属性,也不存在多值属性。
第一范式标准化了关系模式。
若关系模式
R
(
U
)
R(U)
R(U)中,其属于第一范式,且每一非主属性完全函数依赖于候选键,则称
R
(
U
)
R(U)
R(U)属于第二范式,记作
R
(
U
)
∈
2
N
F
R(U) \in 2NF
R(U)∈2NF。例如关系
S
t
u
d
e
n
t
(
S
N
o
,
S
N
a
m
e
,
S
C
l
a
s
s
,
C
o
u
r
s
e
,
S
c
o
r
e
)
Student(SNo,SName,SClass,Course,Score)
Student(SNo,SName,SClass,Course,Score)其函数依赖包括
S
N
o
→
S
N
a
m
e
,
S
N
o
→
S
C
l
a
s
s
,
{
S
N
o
,
C
o
u
r
s
e
}
→
S
c
o
r
e
SNo \rightarrow SName, SNo \rightarrow SClass, \{SNo, Course \} \rightarrow Score
SNo→SName,SNo→SClass,{SNo,Course}→Score其候选键为
{
S
N
o
,
C
o
u
r
s
e
}
\{SNo, Course\}
{SNo,Course},非主属性包括
S
N
a
m
e
,
S
C
l
a
s
s
SName, SClass
SName,SClass。由于
{
S
N
o
,
C
o
u
r
s
e
}
→
p
{
S
N
a
m
e
,
S
C
l
a
s
s
}
\{SNo, Course\}\rightarrow_p \{SName, SClass\}
{SNo,Course}→p{SName,SClass},即部份依赖,故该关系不属于第二范式。
第二范式消除了非必要的冗余。
若关系模式
R
(
U
)
R(U)
R(U)中,其属于第二范式,且
R
R
R中不存在传递函数依赖,则称
R
(
U
)
R(U)
R(U)属于第三范式,记作
R
(
U
)
∈
3
N
F
R(U) \in 3NF
R(U)∈3NF。例如关系
S
t
o
r
e
(
S
t
o
r
e
I
d
,
P
r
o
d
u
c
t
I
d
,
D
e
p
a
r
t
m
e
n
t
I
d
,
M
a
n
a
g
e
r
)
Store(StoreId,ProductId,DepartmentId,Manager)
Store(StoreId,ProductId,DepartmentId,Manager)其函数依赖包括
{
S
t
o
r
e
I
d
,
P
r
o
d
u
c
t
I
d
}
→
D
e
p
a
r
t
m
e
n
t
I
d
,
{
S
t
o
r
e
I
d
,
D
e
p
a
r
t
m
e
n
t
I
d
}
→
M
a
n
a
g
e
r
\{StoreId,ProductId\} \rightarrow DepartmentId, \{StoreId,DepartmentId\} \rightarrow Manager
{StoreId,ProductId}→DepartmentId,{StoreId,DepartmentId}→Manager其存在传递依赖,不属于第三范式。
第三范式消除了非主属性对候选键的传递依赖。
若关系模式 R ( U ) R(U) R(U)中,其属于第一范式,且所有属性均依赖于候选键,则称 R ( U ) R(U) R(U)属于博伊斯-科德【Boyce-Codd】范式,记作 R ( U ) ∈ B C N F R(U)\in BCNF R(U)∈BCNF。例如关系 C o u r s e ( S N o , C N o , T N o ) Course(SNo, CNo, TNo) Course(SNo,CNo,TNo)假定每位教师至多开设一门课,则有 { S N o , C N o } → T N o , T N o → C N o \{SNo, CNo\} \rightarrow TNo, TNo \rightarrow CNo {SNo,CNo}→TNo,TNo→CNo该模式满足第三范式,但不满足博科范式,因为不含候选键 T N o → S N o TNo \rightarrow SNo TNo→SNo。
2.3 模式分解理论
设
R
(
U
)
R(U)
R(U)是属性集合
U
=
(
A
1
,
A
2
,
.
.
.
,
A
n
)
U = (A_1, A_2, ..., A_n)
U=(A1,A2,...,An)上的一个关系模式,使用
R
R
R的子集
ρ
=
{
R
1
(
U
1
)
,
.
.
.
,
R
k
(
U
k
)
}
\rho = \{R_1(U_1), ..., R_k(U_k)\}
ρ={R1(U1),...,Rk(Uk)}代替
R
R
R,称为模式分解。
若对
R
R
R的任何满足函数依赖集
F
F
F的关系
r
r
r,有
r
=
m
ρ
(
r
)
=
π
R
1
(
r
)
⋈
.
.
.
⋈
π
R
k
(
r
)
r = m_\rho(r) = \pi_{R_1}(r) \Join ... \Join \pi_{R_k}(r)
r=mρ(r)=πR1(r)⋈...⋈πRk(r),则称
ρ
\rho
ρ是
R
R
R相对于
F
F
F的一个无损连接分解。
若在
π
R
i
(
F
)
\pi_{R_i}(F)
πRi(F)中的所有依赖的并集逻辑蕴涵
F
F
F的依赖,则称
ρ
\rho
ρ是
F
F
F的保持依赖分解。