Professional Documents
Culture Documents
第5章 关系模型-2019
第5章 关系模型-2019
刘红岩
清华大学 管理科学与工程系
liuhy@sem.tsinghua.edu.cn
简介
关系模型是目前商品化数据库产品的主流数据模型:
IBM DB2、Oracle、SAP Sybase、Microsoft SQL Server、
MySQL、Microsoft Access、…
关系模型有着坚实的理论基础(集合论,数理逻辑),
可以保证关系模型的合理设计和有效实现。
关系模型简洁易用,关系数据库是由一系列的关系组
成,而关系是以人们最熟悉的表格的形式组织和展现
给用户的。
表格中的数据可以使用简单易懂的语言进行复杂地查
询。
山东省 62783456,
2004012345 张珊 2004 f
烟台市 13317509346
关系模型的基本要求:分量不可分,1NF
Hongyan Liu @ Tsinghua University 8
关系
分量
分量可以是空值(null),即什么值都没有,这意
味着两种可能:
一种是其值未知,即目前尚不知道它的取值,如编号为
403的产品的成本,
另一种是不存在,例如,北京市的学生其所属省这个属性
的取值就不存在。
对空值进行判断时,采用特殊的方法,不论属于何
种数据类型,一般都采用“is null” 或者“is
not null”来判断。
关系:关系的实例:
一个关系的内容是随时间而变化的,因此准确地说,
关系实际上是关系的实例(instance)的简称,
关系模式:关系的型
关系模式是关系的型的描述,它一般包括关系的名
字,属性的名字,属性的域等信息
Product(pCode: char(3), pType: char(50), pName: char(50), cost:
real, price: real)
也可暂时忽略域的信息变为:
Product(pCode, pType, pName, cost, price)
关系数据库是若干互不相同的关系组成的,而关系数
据库模式是由若干个与某应用背景相关的关系模式构
成的。
例如,与某公司销售系统有关的另两个关系模式为:
Order(orderNo, custNo, orderDate, delivDate)
orderNo custNo orderDate delivDate
21 10001 2002-1-5 2002-1-5
22 10002 2002-1-5 2002-1-6
主键(primary key)
任意一个候选键都可以定义为主键
每一个表都应该定义一个主键
定义主键之后,DBMS可以识别行的重复,在其他
关系模式中可以通过主键属性来引用该关系模式
中的元组。
例如:
外键(foreign key)
是一个关系中的一个属性或属性组,它不是
本关系的候选键,但它的值引用的是其他关
系的键的取值,或是本关系的键的取值。
例1:
Customer(custNo, custName, custTel)
Order(orderNo, custNo, orderDate, delivDate)
例2:
例2:
Part(partNo, partName, weight, color, itemNo)
主属性、非主属性
包含在任一个候选键中的属性称为主属性
(prime attribute),
没有包含在任一个候选键中的属性称为非主
属性(non-prime attribute)
例:Product(pCode, pType, pName, cost, price)
的主属性和非主属性各有哪些?
假设产品没有重名时,情况又怎样?
约束的类型
域完整性约束(domain integrity constraint)
实体完整性约束(entity integrity constraint)
参照完整性约束(referential integrity constraint)
其他一般性约束
约束的作用
可以检查数据库中数据取值的正确性,最大限度地
符合数据的语义
一个关系中某列的所有取值必须来自该
属性的域
例如,产品的编号pCode属性的域为包含3个
数字的字符串,如果某一个元组在该属性上
的取值为“a01”就违反了该属性的域约束。
DBMS应该提供为每个属性定义域的方法,
并且为定义的域进行合法性检查,具体定义
方法在介绍SQL语句和Access中表的创建时
再详细介绍。
Hongyan Liu @ Tsinghua University 23
实体完整性
约束主键属性的取值
要求每个关系都要定义一个主键,而且主键的取值
不能为空,如果主键是复合键(属性组),则该属
性组中的任一个属性的取值都不能为空。
一般来说,如果一个关系定义了主键,则系统会自
动检查它的每一个取值是否为空,是否重复,如果
为空,或者重复,则系统会给出提示,并且不允许
相应操作的执行。
例:Order(orderNo, custNo, orderDate, delivDate)
OrderDetail(orderNo, pCode, qty, discount)
哪些属性的取值不能为空?
Hongyan Liu @ Tsinghua University 24
参照完整性
参照完整性约束又称为外键约束(foreign
key constraint)
约束的是外键属性的取值:一个表的外键的
取值只能有两种情况:
或者取所参照的表的主键的某个取值,
或者为空,如果属性的域定义或其他约束没有限
定相应属性的取值不可以为空。
Order(orderNo, custNo, orderDate, delivDate)
还有一些约束不是所有关系模式所共同拥有的,
而是依赖于具体的应用背景而具有的一些约束,
例如:
Product表中属性price的取值应该大于属性cost
的取值等。
这些约束应该能够由数据库系统提供的方法来
定义和实施。
关系数据模型的操纵语言分为两类:
关系代数
关系演算
关系代数包括一系列操作符,描述如何一步步
地得到查询结果,
关系演算用谓词表达关系的操作,根据变量的
不同分为:
元组关系演算
域关系演算
关系代数的基本操作包括5个:
选择(selection)
投影(projection)
并(union)
笛卡儿积(cross-product)
集合差(set-difference)
除此之外,还有一些可以由基本运算推
导出的其他运算,如:
交(intersection)
连接(join)
重命名(renaming)
除(division)等
σ 2“足球类” 5>100(Product)
= σ ptype“足球类” (σ price>100(Product))
r s
差 101
102
足球类
足球类
足球
手套
85
90
110
122
201 羽毛球类 羽球鞋 28 38
<关系1> - <关系2> 202 羽毛球类 球拍 200 250
301 游泳类 泳镜 85 102
302 游泳类 泳帽 50 63
π pCode(Product)-π pCode(OrderDetail)
得到的什么? orderNo pCode qty discount
21 101 100 0
21 102 60 0.05
21 202 200 0.1
22 301 1000 0.25
22 302 1000 0
23 202 20 0
24 401 800 0.15
24 402 500 0.2
24 403 500 0
24 101 200 0
交
r-s
<关系1> ∩ <关系2>
r∩s=r-(r-s) r s
例:
π pCode(σ ptype=“羽毛球类”(Product))∩π pCode(OrderDetail)
pCode
101
pCode pCode
102
201 ∩ 202 202
202 301
302
202
401
402
403
笛卡儿积
<关系1> <关系2>
设两个关系分别为r和s,分别含有m1和m2个属性,
以及n1和n2行元组,
r和s的笛卡儿积结果关系包含的属性依次是r的m1个
属性和s的m2个属性
r和s的笛卡儿积结果将包含(n1 n2)行元组
对于r和每一行元组tr和s的每一行元组ts,在结
果中都有一行<tr, ts>存在
符号< tr, ts >代表两行元组的串接
(concatenation)
σ (σ
product.pcode=orderdetatil.pcode ptype=“羽毛球类”( Product)
σ orderno=21(OrderDetail))
连接
<关系1> ⋈c <关系2>
r ⋈c s =σ c( r s)
c代表连接条件,是由逻辑运算符“”或“”连接算术
比较表达式构成的,每个算术比较表达式的组成为:
Ai θ Bj
θ 代表算术比较运算符:、、、、、,Ai和Bj是分
别来自两个关系的属性,或属性和常数组成的算术表
达式。
OrderDetail⋈orderdetail.pcode=product.pcodeProduct
orderdetail. Product.
orderNo
orderNo pCode qty discount
discount pCode pType pName cost price
pCode pCode
21 101 100 0 101 足球类 足球 85 110
21 101 100 0 101 足球类 足球 85 110
21 102 60 0.05 102 足球类 手套 90 122
21 102 60 0.05 102 足球类 手套 90 122
21 202 200 0.1 202 羽毛球类 球拍 200 250
21 202 200 0.1 202 羽毛球类 球拍 200 250
22 301 1000 0.25 301 游泳类 泳镜 85 102
22 301 1000 0.25 301 游泳类 泳镜 85 102
22 302 1000 0 302 游泳类 泳帽 50 63
22 302 1000 0 302 游泳类 泳帽 50 63
23 202 20 0 202 羽毛球类 球拍 200 250
23 202 20 0 202 羽毛球类 球拍 200 250
24 401 800 0.15 401 健美类 拉力器 40.5 54.5
24 401 800 0.15 401 健美类 拉力器 40.5 54.5
24 402 500 0.2 402 健美类 十磅哑铃 70 92
24 402 500 0.2 402 健美类 十磅哑铃 70 92
连接
查找足球类产品的销售情况,包括产品编号、名称、
订单编号,产品原价,折扣,数量
π pCode,pName,orderno,price,discount,qty(σ pType=”足球类” (Product)
⋈ product.pcode=orderdetail.pcode OrderDetail)
pCode pType pName cost price orderNo pCode qty discount
21 101 100 0
101 足球类 足球 85 110
21 102 60 0.05
102 足球类 手套 90 122 21 202 200 0.1
22 301 1000 0.25
22 302 1000 0
pCode pName orderNo price discount qty 23 202 20 0
24 401 800 0.15
101 足球 21 110 0 100
24 402 500 0.2
102 手套 21 122 0.05 60 24 403 500 0
101 足球 24 110 0 200 24 101 200 0
45
连接
π pCode,pName (Product⋈(price*(1-discount)<cost)
(product.pcode=orderdetail.pcode)OrderDetail)
orderdetail. Product.
orderNo
orderNo pCode qty discount
discount pCode pType pName cost price
pCode pCode
21 101 100 0 101 足球类 足球 85 110
21 101 100 0 101 足球类 足球 85 110
21 102 60 0.05 102 足球类 手套 90 122
21 102 60 0.05 102 足球类 手套 90 122
21 202 200 0.1 202 羽毛球类 球拍 200 250
21 202 200 0.1 202 羽毛球类 球拍 200 250
22 301 1000 0.25 301 游泳类 泳镜 85 102
22 301 1000 0.25 301 游泳类 泳镜 85 102
22 302 1000 0 302 游泳类 泳帽 50 63
22 302 1000 0 302 游泳类 泳帽 50 63
23 202 20 0 202 羽毛球类 球拍 200 250
23 202 20 0 202 羽毛球类 球拍 200 250
24 401 800 0.15 401 健美类 拉力器 40.5 54.5
24 401 800 0.15 401 健美类 拉力器 40.5 54.5
24 402 500 0.2 402 健美类 十磅哑铃 70 92
24 402 500 0.2 402 健美类 十磅哑铃 70 92
自然连接
连接条件为属性名相同的属性的取值相等,
结果关系将属性名相同的列只保留一个的
连接称为自然连接(natural join):
r ⋈ s
orderNo
orderNo pCode
pCode qtyqty discount
discount
pCode
pType
pType pName
pName cost
cost price
price
21
21 101
101 100100 0 0 101 足球类
足球类 足球
足球 8585 110
110
21
21 102
102 60 60 0.05 0.05 102 足球类
足球类 手套
手套 9090 122
122
21
21 202
202 200200 0.1 0.1 202 羽毛球类
羽毛球类球拍
球拍 200
200 250
250
22
22 301 1000 0.25 0.25 301 游泳类
301 1000 游泳类 泳镜
泳镜 8585 102
102
22
22 302
302 1000
1000 0 0 302 游泳类
游泳类 泳帽
泳帽 5050 63
63
23
23 202
202 20 20 0 0 202 羽毛球类
羽毛球类球拍
球拍 200
200 250
250
24
24 401
401 800800 0.15 0.15 401 健美类
健美类 拉力器
拉力器 40.5
40.5 54.5
54.5
24
24 402
402 500500 0.2 0.2 402 健美类
健美类 十磅哑铃
十磅哑铃 7070 92
92
24
24 101
101 200200 0 0 101 足球类
足球类 足球
足球 8585 110
110 49
自然连接
例: π pCode,pName,price(σ pType=”足球类”(Product) )
⋈ OrderDetail ⋈ π orderNo, orderDate(Order)
外连接:
左外连接(left outer join):
r *⋈ c s
右外连接(right outer join):
r ⋈* c s
全外连接(full outer join):
r *⋈* c s
查找每个零件的编号、名称以及构成它的子零件的编号和名称
π part.pno,part.pname,part.subpno,sp.pname(part⋈part.subpno=sp.pno ρ sp(Part))
π part.pno,part.pname,part.subpno.pno,sp.pname
(part *⋈part.subpno=sp.pno ρ sp(Part) )
pno pname weight subpno pno pname weight subpno
1 p1 10 1 p1 10
2 p2 20 1 2 p2 20 1
3 p3 30 2 3 p3 30 2
<关系1> <关系2>
r s =π x (r)- π x((π x (r) s) - r)
x代表r中不包含于s中的属性集,即x=attr.(r)-
attr.(s),
例:
π (OrderDetail)
orderNo, pCode
π pCode(σ pType=”足球类” (Product))
π (OrderDetail)
orderNo, pCode orderNo
π pCode(σ pType=”足球类” (Product)) 21
orderNo qty pCode
除 21 100 101
21 60 102
21 200 202
π orderNo, pCode,qty (OrderDetail) 22 1000 301
22 2000 302
23 20 202
π pCode(σ pType=”足球类”(Product))
24
24
800
500
401
402
24 500 403
pCode 24 200 101
101
102
π orderNo,pCode,qty(OrderDetail)
π pCode(σ pType=”足球类” (Product))
除
order pCode pName
No
21 101 足球
21 102 手套
π orderNo, pCode,pName(OrderDetail) 21 202 球拍
22 301 泳镜
22 302 泳帽
π pCode,pName(σ pType=”足球类”(Product)) 23 202 球拍
24 401 拉力器
24 402 十磅哑铃
pCode pName
24 403 跳绳
101 足球 24 101 足球
102 手套
π orderNo,pCode,pName(OrderDetail)
orderNo
π pCode,pName(σ pType=”足球类” (Product))
21
个人作业
P76-77
5.5: (1)(2)(3)
5.6(仍以5.5中表为基础)关系代数
包含101号产品的订单号
不包含101号产品的订单号
购买过101号产品的客户号
没有购买过101号产品的客户号
orderNo pCode qty discount
review
orderNo
21
custNo
10001
orderDate
2002-1-5
delivDate
2002-1-5
21
21
101
102
100
60
0
0.05
22 10002 2002-1-15 2002-1-16 21 202 200 0.1
22 301 1000 0.25
23 10003 2002-2-10 2002-2-20 22 302 1000 0
24 10002 2002-3-4 2002-3-5 23 202 20 0
24 401 800 0.15
24 402 500 0.2
24 101 200 0
包含101号产品的订单号
πorderNo(σpCode=”101”(orderDetail))
不包含101号产品的订单号
πorderNo(σpCode≠”101”(orderDetail))
πorderNo (Order) -πorderNo(σpCode=”101”(orderDetail))
orderNo pCode qty discount
review
orderNo
21
custNo
10001
orderDate
2002-1-5
delivDate
2002-1-5
21
21
101
102
100
60
0
0.05
22 10002 2002-1-15 2002-1-16 21 202 200 0.1
22 301 1000 0.25
23 10003 2002-2-10 2002-2-20 22 302 1000 0
24 10002 2002-3-4 2002-3-5 23 202 20 0
24 401 800 0.15
24 402 500 0.2
购买过101号产品的客户号 24 101 200 0
πcustNo(σpCode=”101”(orderDetail)⋈ Order)
没有购买过101号产品的客户号
πcustNo(σpCode≠”101”(orderDetail)⋈ Order)
πcustNo(πorderNo (Order) -πorderNo(σpCode=”101”(orderDetail))⋈
Order)
πcustNo(Order) –πcustNo(σpCode=”101”(orderDetail)⋈ Order)
笛卡儿积
πorderNo (OrderDetail) πpCode(σpType=”足球类” (Product))
orderNo orderNo pCode
21 21 101
22 21 102
23 22 101
24 22 102
× 23 101
pCode 23 102
24 101
101
24 102
102
orderNo pCode
orderNo pCode 21 101
21 101 21 102
21 202 orderNo pCode
21 102
22 301 22 101
22 101
22 302
22 102 22 102
23 202
23 101 23 101
24 401
23 102 23 102
24 402
24 101 24 102
24 403
24 102 24 101
66
πorderNo (OrderDetail)- πorderNo(πorderNo (OrderDetail)
πpCode(σpType=”足球类” (Product)) –πorderNo,pcode
(OrderDetail))
orderNo pCode
22 101 orderNo
22 102 22
23 101 orderNo
23 102
23
24 21
24 102
67
思考题:
π pCode(Product) –
π product.pCode( Product ⋈ product.price<p.price ρ p(Product) )