软件设计师-数据库
E-R模型
实体(Entity):是指客观存在可以相互区别的事务。实体可以是具体的
对象,如:一个工厂职工,一辆汽车等;也可以是 抽象的事件,如一次借书,
一场足球赛等。
实体型使用矩形表示如:
属性(Attribute):实体有很多特性,每个特性称为属性。每个属性有个值域,其类型可以是整型、实数、字符串、 。
比如学生(实体),有学号、姓名、年龄、性别等属性、相应值域为 字符、 字符串、整数和字符串型。
属性用椭圆形表示,例如:
联系(Relationship)
1:1联系: 如果实体集E1中的每个实体最多只能和实体集E2中的一个实体有联系,反之亦然,那么实体集E1对E2的联系就是称为“一对一联系”,记为“1:1”。
1:N 联系:如果实体集E1中每个实体集与实体集E2中任意个(1个或多个)实体有联系,而E2
中每个 实体至多与E1中的一个实体有联系,那么E1和E2的联系是"一对多",记为1:N“”。
M:N联系: 如果实体集E1中每个实体与实体集E2中(零个或多个)实体有联系,反之亦然,那么E1
对E2的联系是“多对多联系”,记为“M:N”。
ER模型转换成关系模式的规则
一个实体型转换为一个关系模式,实体的属性就是关系的属性,实体的码就是关系的码
1:1
遇到1:1 关系的话在两个实体任选一个添加另一个实体的主键即可。
1:N
1:N 遇到 1:N 关系的话在N端添加另一端的主键,假如有学生和班级两个实体,一个班级可以容纳多个学生,但是一个学生只能选择一个班级, 因此班级和学生是1:N的关系,现在要转换为关系模型, 我们只需在学生的这端加上班级的唯一标识即可,这样做的原因是,因为一个学生只能有一个班级,班级是相对学生唯一的。
N:M
遇到N:M我们需要将联系转换为实体,然后在该实体上加上另外两个实体的主键,作为联系实体的主键,然后再加上该联系自身带的属性即可。例如有学生和老师两个实体, 一个学生可以由多名老师来授课,一名老师也可以授课多名学生,它们是M:N关系的,假如联系为授课,该联系上有成绩属性,因此当我们把它转换为关系模型时,我们把联系转换为联系实体,并添加学生实体的主键(学号)和教师实体的主键(教师编号)作为自己的主键,值得注意的是,授课实体的外键分别是学号和教师编号,但是它的主键是(学号,教师编号),另外它还拥有自己的一个属性成绩。
1:1:N
这是三元联系的对应关系,但是当转换为关系模型时,和1:N的情况是差不多的。我们只需将N端添加另外两端的主键即可。
M:N:P
这种三元联系的三种多对应关系,看上去很复杂,其实转换起来并不是那么复杂了,我们要做的仅仅是将其中的联系转换为联系实体,然后在联系实体上添加M端N端P端的主键,然后加上联系实体自身的属性,就行了。
例子:
说了这么多看个小例子。
这是一份关于商店商品仓库的ER图。
先看仓库和商品之间是M:N的关系,于是我们首先想到的应该是把联系 库存转换为库存实体。
库存 (仓库号,商品号,日期,库存量)
然后是商品实体和仓库实体
商品(商品号,商品名,单价)
仓库(仓库号,仓库名,地址)
除此之外仓库和商品还有一个供应关系,同样是M:N关系:
供应 (仓库号,商品号 ,月份,月供应量)
在上图的商店和仓库之间的关系可能写漏了,但是它们应该也是M:N的关系,一个商店可以被多个仓库供应,一个仓库也可以供应多个商店。上面已经创建了供应实体,现在只需在供应实体中假如商店号即可,也就是商店实体的主键。
供应(仓库号,商品号,商店号 ,月份,月供应量)
商店(商店号,商店名,地址)
键(码)、函数依赖及范式
超键:在关系模式中,能唯一标识元组的属性集称为超键。
候选键:在关系模式中,能唯一标识元组且不含多余属性的属性集称为候选键。
超键与候选键的区别是候选键可能含有多余元素
主键:在一个关系的若干个候选键随意选择一个关键字,这个关键字就是主键。
外键:如果关系模式R1中的某属性集不是R1的候选键,而是关系模式R2的候选键,
则这个属性集对模式R1而言是外键,注意这不是对于R2而言的。
二、6个范式
好了,上面已经介绍了我们掌握范式所需要的全部基础概念,下面我们就来讲范式。首先要明白,范式的包含关系。一个数据库设计如果符合第二范式,一定也符合第一范式。如果符合第三范式,一定也符合第二范式…
第一范式(1NF):属性不可分。
在前面我们已经介绍了属性值的概念,我们说,它是“不可分的”。而第一范式要求属性也不可分。那么它和属性值不可分有什么区别呢?给一个例子:
name | tel | age | |
大宝 | 13612345678 | 22 | |
小明 | 13988776655 | 010-1234567 | 21 |
Ps:这个表中,属性值“分”了。
name | tel | age | |
手机 | 座机 | ||
大宝 | 13612345678 | 021-9876543 | 22 |
小明 | 13988776655 | 010-1234567 | 21 |
Ps:这个表中,属性 “分”了。
这两种情况都不满足第一范式。不满足第一范式的数据库,不是关系数据库!所以,我们在任何关系数据库管理系统中,做不出这样的“表”来。(也就是说,只要是关系数据库就是第一范式)
第二范式(2NF):符合1NF,并且,非主属性完全依赖于码。
听起来好像很神秘,其实真的没什么。
一个候选码中的主属性也可能是好几个。如果一个主属性,它不能单独做为一个候选码,那么它也不能确定任何一个非主属性。给一个反例:我们考虑一个小学的教务 管理系统,学生上课指定一个老师,一本教材,一个教室,一个时间,大家都上课去吧,没有问题。那么数据库怎么设计?(学生上课表)
学生 | 课程 | 老师 | 老师职称 | 教材 | 教室 | 上课时间 |
小明 | 一年级语文(上) | 大宝 | 副教授 | 《小学语文1》 | 101 | 14:30 |
一个学生上一门课,一定在特定某个教室。所以有(学生,课程)->教室
一个学生上一门课,一定是特定某个老师教。所以有(学生,课程)->老师
一个学生上一门课,他老师的职称可以确定。所以有(学生,课程)->老师职称
一个学生上一门课,一定是特定某个教材。所以有(学生,课程)->教材
一个学生上一门课,一定在特定时间。所以有(学生,课程)->上课时间
因此(学生,课程)是一个码。
然而,一个课程,一定指定了某个教材,一年级语文肯定用的是《小学语文1》,那么就有课程->教材。(学生,课程)是个码,课程却决定了教材,这就叫做不完全依赖,或者说部分依赖。出现这样的情况,就不满足第二范式!
有什么不好吗?你可以想想:
1、校长要新增加一门课程叫“微积分”,教材是《大学数学》,怎么办?学生还没选课,而学生又是主属性,主属性不能空,课程怎么记录呢,教材记到哪呢? ……郁闷了吧?(插入异常)
2、下学期没学生学一年级语文(上)了,学一年级语文(下)去了,那么表中将不存在一年级语文(上),也就没了《小学语文1》。这时候,校长问:一年级语文(上)用的什么教材啊?……郁闷了吧?(删除异常)
3、校长说:一年级语文(上)换教材,换成《大学语文》。有10000个学生选了这么课,改动好大啊!改累死了……郁闷了吧?(修改异常)
那应该怎么解决呢?投影分解,将一个表分解成两个或若干个表
学生 | 课程 | 老师 | 老师职称 | 教室 | 上课时间 |
小明 | 一年级语文(上) | 大宝 | 副教授 | 101 | 14:30 |
学生上课表新
课程 | 教材 |
一年级语文(上) | 《小学语文1》 |
课程的表
第三范式(3NF):符合2NF,并且,消除传递依赖
上面的“学生上课表新”符合2NF,可以这样验证:两个主属性单独使用,不用确定其它四个非主属性的任何一个。但是它有传递依赖!
在哪呢?问题就出在“老师”和“老师职称”这里。一个老师一定能确定一个老师职称。有什么问题吗?想想:
1、老师升级了,变教授了,要改数据库,表中有N条,改了N次……(修改异常)
2、没人选这个老师的课了,老师的职称也没了记录……(删除异常)
3、新来一个老师,还没分配教什么课,他的职称记到哪?……(插入异常)
那应该怎么解决呢?和上面一样,投影分解:
学生 | 课程 | 老师 | 教室 | 上课时间 |
小明 | 一年级语文(上) | 大宝 | 101 | 14:30 |
老师 | 老师职称 |
大宝 | 副教授 |
BC范式(BCNF):符合3NF,并且,主属性不依赖于主属性
若关系模式属于第一范式,且每个属性都不传递依赖于键码,则R属于BC范式。
通常BC范式的条件有多种等价的表述:每个非平凡依赖的左边必须包含键码;每个决定因素必须包含键码。BC范式既检查非主属性,又检查主属性。当只检查非主属性时,就成了第三范式。满足BC范式的关系都必然满足第三范式。还可以这么说:若一个关系达到了第三范式,并且它只有一个候选码,或者它的每个候选码都是单属性,则该关系自然达到BC范式。
一般,一个数据库设计符合3NF或BCNF就可以了。在BC范式以上还有第四范式、第五范式。
无损连接分解
有损:不能还原。
无损:可以还原。
无损联接分解
将一个关系模式分解成若干个分解模式后,通过自然连接和投影等运算仍能还原的原来的关系模式,则这种称为无损分解联接模式。
关系代数基本运算
关系代数 5种基本运算并、差、笛卡尔积、选择和投影。
1并(Union,符号U表示):计算两个表在集合理论上的联合
2.差(difference用符号-表示):计算两个表的区别的集合。R和S是拥有相同元/列
的表。R-S是在R里面却不在S里面记录的集合。
3.笛卡尔积(PRODUCT,用符号X表示):计算两个关系的笛卡尔积。
R为有K1元的表,S为有K2元的表。RxS是所有K1+K2元记录的集合,其前K1个元素来自R里的一条记录,而后K2个元素来自S里的一条记录。
4.投影(Project,用符号π表示):从一个关系里面抽取指明的属性(列).令R为一个包含一个属性X的关系.
π X (R) ={t(X)|t∈R},这里t(x)表示记录t里面的属性X的值.
5选择(select,用符号δ表示):从关系里面抽取出满足给定限制条件的记录.
R为一个表,包含一个属性A,δA= a(R) = {t∈R|t(A) =a}这里t表示R的一条记录。而t(A)表示t的属性A的值。
6交(Intersection,用符号∩表示),将表中R1和R2的共同属性选出来。
8.除(Division,用符号÷表示)。R(X,Y)与关系S(Z),其中X,Y,Z为属性集合。假设Y和Z具有相同的属性个数且对应属性出自相同域。关系R(X,Y)÷S(Z)所得的商关系是关系R在属性X上投影的一个子集该子集和S(Z)的笛卡尔积必须包含在R(X,Y)
中,记为R÷S。
元组关系演算
在元组关系演算系统中,称 {t|Φ(t)} 为元组演算表达式。其中 t 是元组变量, Φ(t) 为元组关系演算公式,简称公式。
它由原子公式和运算符组成。
原子公式有三类:
(1) R(t)
R 是关系名, t 是元组变量。 R(t) 表示 t 是 R 中的元组。于是,关系 R 可表示为: {t|R(t)}
(2) t[i] θ u[j]
t 和 u 是元组变量, θ 是算术比较运算符。 t[i] θ u[j] 表示断言 “ 元组 t 的第 i 个分量与元组 u 的第 j 个分量满足比较关系 θ ” 。例如, t[2] < u[3] 表示元组 t 的第 2 个分量小于元组 u 的第 3 个分量。
(3) t[i] θ c 或 c θ t[i]
这里 c 是常量,该公式表示 “t 的第 i 个分量与常量 C 满足比较关系 θ” 。例如: t[4]=3 表示元组 t 的第 4 个分量等于 3 。
在关系演算中定义了 “ 自由元组变量 ” 和 “ 约束元组变量 ” 的概念。这些概念和谓词演算中的概念完全一样。若公式中的一个元组变量前有 “ 全称量词 ” 或 “ 存在量词 ” ,则称该变量为约束元组变量,否则称自由元组变量。
公式可以递归定义如下:
(l) 每个原子公式是公式。
(2) 如果 Φ 1 和 Φ 2 是公式,则 Φ 1 ∧ Φ 2 、 Φ 1 ∨ Φ 2 、 ﹁ Φ1 也是公式。分别表示:
① 如果 Φ 1 和 Φ 2 同时为真。则 Φ 1 ∧ Φ 2 才为真,否则为假;
② 如果 Φ 1 和 Φ 2 中一个或同时为真,则 Φ 1 ∨ Φ 2 为真,仅 Φ 1 和 Φ 2 同时为假时, Φ 1 ∨ Φ 2 才为假;
③ 如果 Φ 1 真,则 ﹁ Φ 1 为假。
(3) 若 Φ 是公式,则 ∃ t(Φ) 也是公式。其中符号 ∃ 是存在量词符号, ∃ t(Φ) 表示:
若有一个 t 使 Φ 为真,则 ∃ t(Φ) 为真,否则 ∃ t(Φ) 为假。
(4) 若 Φ 是公式,则 ∀ t( Φ ) 也是公式。其中符号 ∀ 是全称量词符号, ∀ t( Φ ) 表示:
如果对所有 t ,都使 Φ 为真,则 ∀ t( Φ ) 必为真,否则 ∀ t( Φ ) 为假。
(5) 在元组演算公式中,各种运算符的优先次序为:
① 算术比较运算符最高;
② 量词次之,且 ∃ 的优先级高于 ∀ 的优先级;
③ 逻辑运算符最低,且 ﹁ 的优先级高于 ∧ 的优先级, ∧ 的优先级高于 ∨ 的优先级;
④ 加括号时,括号中运算符优先,同一括号内的运算符之优先级遵循 ①②③ 各项。
(6) 有限次地使用上述五条规则得到的公式是元组关系演算公式,其他公式不是元组关系演算公式。
一个元组演算表达式 {t|Φ(t)} 表示了使 Φ(t) 为真的元组集合。
关系代数的运算均可以用关系演算表达式来表示 ( 反之亦然 ) 。下面用关系演算表达式来表示五种基本运算:
(1) 并
R ∪ S={t|R(t) ∨ S(t)}
(2) 差
R - S={t|R(t) ∧ ﹁ S(t)}
(3) 笛卡尔积
R×S={t (n+m) |( ∃ u (n) )( ∃ v (m) )(R(u) ∧ S(v) ∧ t[1]=u[1] ∧ ... ∧ t[n]=u[n] ∧ t[n+1]=v[1] ∧ ... ∧ t[n+m]=v[m])}
注: t (n+m) 表示 t 有目数 (n+m)
(4) 投影
π t1,t2,...,tk (R)={t (k) |( ∃ u )(R(u) ∧ t[1]=u[i1] ∧ ...t[k]=u[ik] )}
(5) 选择
σ F (R)={t|R(t) ∧ F}
注: F 是公式。 F 用 t[i] 代替 运 算 对 象 i 得到的等价公式。
例 1 查询信息系 (IS 系 ) 全体学生:
S IS ={Student(t) ∧ t[5]='IS'}
例 2 查询年龄小于 20 岁的学生。
S 20 ={Student(t) ∧ t[4]<20}
例 3 查询学生的姓名和所在系。
S={t (2) |( ∃ u)(Student(u) ∧ t[1]=u[2] ∧ t[2]=u[5])}
上面定义的关系演算允许出现无限关系。例如 {t| ﹁ R(t)} 表示所有不属于 R 的元组 ( 元组的目数等于 R 的目数 ) 。要求出这些可能的元组是做不到的,所以必须排除这类无意义的表达式。把不产生无限关系的表达式称为安全表达式,所采取的措施称为安全限制。安全限制通常是定义一个有限的符号集 dom(Φ) , dom(Φ) 一定包括出现在 Φ 以及中间结果和最后结果的关系中的所有符号 ( 实际上是各列中值的汇集 ) 。 dom(Φ) 不必是最小集。
当满足下列条件时,元组演算表达式 {t|Φ(t)} 是安全的:
( 1 )如果 t 使 Φ(t) 为真,则 t 的每个分量是 dom(Φ) 中的元素。
( 2 )对于 Φ 中每一个形如 ( ∃ t)(W(u)) 的子表达式,若 u 使 W(u) 为真,则 u 的每个分量是 dom(Φ) 中的元素。
( 3 )对于 Φ 中每一个形如 ( ∀ t)(W(u)) 的子表达式,若 u 使 W(u) 为假,则 u 的每个分量必属于 dom(Φ) 。换言之,若 u 某一分量不属于 dom(Φ) ,则 W(u) 为真。
例 4 设有关系 R 如图 2.8(a) , S={t| ﹁ R(t)} ,若不进行安全限制,则可能是一个无限关系。所以定义
dom(Φ)= π A (R) ∪ π B (R) ∪ π C (R)
={{a1,a2},{b1,b2},{c1,c2}}
则 S 是 dom(Φ) 中各域值中元素的笛卡儿积与 R 的差集。结果如图 2.8(b) 。注意,在做笛卡儿积时各个域中的元素不能搞混。
附:其他类型举例:
-----------------------------------------------------------------------------------------
1 、下列等式中恒等的是:
① π A1,A2 ( σ F (E))≡ σ F ( π A1,A2 (E))
② σ F (E 1 × E 2 )≡ σ F (E 1 ) ×σ F (E 2 )
③ σ F (E 1 -E 2 )≡ σ F (E 1 )- σ F (E 2 )
④ π A1,A2,B1,B2 (EE)≡ π A1,A2 (E)
π B1,B2 (E)
① 当 F 包含 A1,A2 以外的限制 时 ,不恒等
② 当 F 包含大于 E1( 或 E2) 个数 的限制 时 ,不恒等
③ 恒等
④ 等式不可能成立,右 边没 有相同 属 性
2 、以下元 组 的意 义 :
{t|( ∃ u)((R(u) ∨ S(u)) ∧ ( ∀ v)(T(v)→( ∃ w)((R(w) ∨ S(w)) ∧ w[1]=u[1] ∧ w[2]=v[1] ∧ w[3]=v[2])) ∧ t[1]=u[1]}
据 说 是表示 R ∪ S ÷ T 的意思,但是我 实 在是看不 懂 。
3 、以下元 组 表 达 式 转换为关 系代 数 表 达 式
{t| ∃ u ∃ v(R(u) ∧ S(v) ∧ u[3]=v[1] ∧ u[4]=v[2] ∧ u[1]>v[3] ∧ t[1]=u[2])}
其中 R(A,B,C,D) S(C,D,E)
关 系代 数 表 达 式 为 : π B ( σ A>E (RS))
4 、把下列 关 系代 数 表 达 式 转换为 元 组 表 达 式
π 1,4 (RS)
其中 R(A,B,C) S(B,D)
元 组 演算表 达 式 为 : {t| ∃ u ∃ v(R(u) ∧ S(v) ∧ u[2]=v[1] ∧ t[1]=u[1] ∧ t[2]=v[2])}
5 、 关 系代 数 表 达 式 → 元 组 演算表 达 式
π 1,5,6 ( σ 1>5 (R×S)) -- 注意中 间 是乘法不是自然 连 接
其中 R(A,B,C) S(A,B,C)
{t| ∃ u ∃ v(R(u) ∧ S(v) ∧ u[1]>v[2] ∧ t[1]=u[1] ∧ t[2]=v[2] ∧ t[3]=v[3])}
6 、下列 查询 效率最高的一 组 是:
① E1= π A,D ( σ B<'2007' ∧ R.C=S.C ∧ E='80' (R × S))
② E2= π A,D ( σ R.C=S.C ( σ B<'2007' (R) ×σ E='80' (S)))
③ E3= π A,D ( σ B<'2007' (R) σ E='80' (S))
④ E4= π A,D ( σ B<'2007' ∧ E='80' (RS))
答案是 ③ ,很明 显 自然 连 接要 优 于笛卡尔 积 ,先 运 算再投影 优 于 先投影再 计 算