第五讲:关系数据结构及关系完整性
关系数据结构
笛卡尔积
- 笛卡尔积:给定一组域D1,D2,…,Dn,允许其中某些域是相同的。
1.其笛卡尔积是: D 1 × D 2 × . . . × D n = { ( d 1 , d 2 , . . . d n ) ∣ d i ∈ D i , i = 1 , 2 , . . . , n } D_{1}\times D_{2}\times ...\times D_{n}=\{(d_{1},d_{2},...d_{n})\mid d_{i}\in D_{i},i=1,2,...,n\} D1×D2×...×Dn={(d1,d2,...dn)∣di∈Di,i=1,2,...,n}
2. 所有域的所有取值的任意组合,笛卡尔积可以看着是关系的“域”
3.基数:若Di(i=1,2,…n)为有限集,其基数为mi(i=1,2,…,n),则 D 1 × D 2 × . . . × D n D_{1}\times D_{2}\times ...\times D_{n} D1×D2×...×Dn的基数M为: M = ∏ i = 1 n m i M=\prod_{i=1}^n m_{i} M=i=1∏nmi - 笛卡尔积的表示方法
- 笛卡尔积可表示为一张二维表
- 表中的每行对应一个元组,表中的每列对应一个域
关系数据结构
域:
域是一组具有相同数据类型的值的集合。如:整数、实数等
关系:(笛卡尔的一个子集)
D 1 × D 2 × . . . × D n D_{1}\times D_{2}\times ...\times D_{n} D1×D2×...×Dn的子集叫做在域D1,D2…Dn上的关系,表示为R(D1,D2…Dn)。R:关系名。n:关系的目或度
元组:关系中的每个元素,二维表中的一行
(d1,d2,…,dn)叫作一个n元组或简称元组,通常用t表示- 元组中的一个元素为分量
属性:表中的一列
1. 关系中不同的列可以对应相同的域.
2. 为了加以区分,必须对每列起一个名字,称为属性
3. n目关系必有n个属性- 码:(1)候选码:关系中的某一属性组的值可唯一标示一个元组。则该属性组为候选码。(2)全码:最极端的情况,关系模的所有属性组是这个关系模式的候选码
- 关系定义在单个属性上的为单元关系,定义在两个属性上的为二元关系
- 基本关系的性质
1.列是同质的
2.不同的列可出自同一个域
3.列的顺序无所谓,列的次序可任意交换
4.任意两个元组的候选码不能相同
5.行的顺序无所谓,次序可任意交换
6.分量必须取原子值(基本原则)
7.关系必须是笛卡尔集的某个子集才有实际意义。
关系模式
- 关系模式是型,关系是值。
- 关系模式是对关系的描述
- 元组集合的结构:1.属性的构成2.属性来自的域3.属性和域之间的映象关系
- 完整性约束条件
- 关系模式可以形式化地表示为:
R(U,D,DOM,F)。
R为关系名,
U为组成该关系的属性名集合,
D为U中属性所来自的域,
DOM为属性向域的映象集合,
F为属性间数据的依赖关系的集合
域名及属性向域的映像常常直接说明为属性的类型、长度
关系完整性约束
- 实体完整性和参照完整性:关系模型必须满足的完整性约束条件称为关系的两个
不变性
,应由关系系统自动支持 - 用户定义的完整性:应用领域需要遵循的约束条件,体现了具体领域中的语义约束
实体完整性
关系的主码中的属性即主属性不能取空
(无意义,不存在为空值),主码要在关系模型中做唯一标示的
参照完整性
- 参照完整性:在关系模型中实体积实体间的联系都是用关系来描述的,自然存在着关系与关系间的引用
- 设F是基本关系R的一个或一组属性,但不是关系R的码。若F与基本关系S的主码Ks 相对应,则称F是R的外码。外码取值必须满足参照完整性。
- 基本关系R称为参照关系,基本关系S称为被参照关系或目标关系
- 外码F可以取空值(F的每个属性均为空值)
- 外码F可以等于S中某个元组的主码值
用户定义的完整性
- 针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求
- 关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不需由应用承担这一功能
关系代数
传统集合操作
- 关系代数语言
- 用对关系的运算来表达查询要求
- 关系演算语言:用谓词来表达查询要求
- 元组关系演算语言
- 谓词变元的基本对象是元组变量
- 代表:APLHA,QUEL
- 域关系演算语言
- 谓词变元的基本对象是域变量
- 代表:QBE
- 元组关系演算语言
- 具有关系代数和关系演算双重特点的语言
- 代表:SQL
关系代数
- 关系代数:抽象查询语言,对关系的运算来表达查询
- 关系代数
- 运算对象是关系,结果是关系
- 运算符有两类:集合运算符和专门的关系运算符
传统的集合运算
- 传统的集合运算主要指并、交、差、广义笛卡尔积四种运算
- 要求参与运算的两个关系必须是相容的
- 相容:两个关系的列数(
目
)相同,对应的属性列出自同一个域。 - 并交差都以行来运算
- 并:去掉重复行
- 差:R-S——>R中减去S中相同的元组
- 广义笛卡尔积:n目的关系R,和m目的关系S的广义笛卡尔积为n+m关系,记为R × \times ×S。其中前n个属性为R的属性集,前m个属性为S的属性集合且R × \times ×S中的每个元组为每一个R元组和所有S元组的组合。所有可能属性以行连接运算
专门的关系运算
选择
选择:水平上选符号条件F的元组,结果为原有关系的子集,在关系R中选择满足给定条件的元组,组成一个新的关系。 σ F ( R ) \sigma_{F}(R) σF(R):在R中选,满足F条件的
查询图书关系中单价大于50元的图书信息
σ 单 价 > 50 ( 图 书 ) \sigma_{单价>50}(图书) σ单价>50(图书)
投影
- 投影:从关系R上选取若干属性列A,并删除重复行,组成新的关系。(从列的角度计算)。记做:
Π
A
(
R
)
\Pi_{A}(R)
ΠA(R)
投影中下标处多个属性的用逗号相隔。
图书馆管理系统
(1)查询图书关系中所有图书的书名及出版社。
解: 仅涉及目标属性书名与出版社,并无选择条件,是投影。则
Π 书 名 , 出 版 社 ( 图 书 ) \Pi_{书名,出版社}(图书) Π书名,出版社(图书)
(2)查询书名为”大学英语“的作者及库存数量。
解:涉及选择条件为”大学英语“,且有明确的目标属性要求,故既要选择又要投影。
Π 作 者 , 库 存 量 ( σ 书 名 = ‘ 大 学 英 语 ’ ( 图 书 ) ) \Pi_{作者,库存量}(\sigma_{书名=‘大学英语’}(图书)) Π作者,库存量(σ书名=‘大学英语’(图书))
连接:
连接操作是由选择和笛卡尔积
操作组合而成的。
- 等值连接:
R
⋈
A
=
B
S
R\underset{A=B}\Join S
RA=B⋈S
从关系R和S的广义笛卡尔积中选取A、B属性组值相等的那些元组(行)
①求R × \times ×S。②选择R和S公共属性相同的元组。 - 自然连接:
R
⋈
S
R\Join S
R⋈S
是一种特殊的等值连接;在R × \times ×S中,选取公共属性上具有相同值得元组,并去掉相同的属性列,组成新关系。两个关系通过共有的属性,即表的某一列进行连接。
R与S中的公共属性即属性集的交集(相同名称与类型);在结果中把重复的属性列去掉。
①求R × \times ×S。②选择R和S公共属性相同的元组。③在等值连接计算基础上去掉重复的属性列。
除:
R ÷ S R\div S R÷S的结果是,一个关系某些元组,拥有另一个关系的某一字段的所有值。
- 一般求全部B的A用除,A÷B
R ÷ S R\div S R÷S,设R为r元关系,表示R(X,Y),S为s元关系,表示S(Y),其中X,Y可以是单个属性或属性集,当tr[x]=x时,x在R中的象集Yx定义为 Y x = { t r [ Y ] ∣ t r ∈ R ⋀ t r [ X ] = x } Y_{x}=\{t_{r}[Y]\mid t_r\in R\bigwedge t_{r}[X]=x\} Yx={tr[Y]∣tr∈R⋀tr[X]=x}
除法定义为 R ÷ S = { t r [ X ] ∣ t r ∈ R ⋀ S ( Y ) ⊆ Y x } R\div S=\{t_{r}[X]\mid t_r\in R\bigwedge S(Y)\subseteq Y_{x}\} R÷S={tr[X]∣tr∈R⋀S(Y)⊆Yx}
R ÷ S R\div S R÷S的结果可以表示为P(X),P(X)是关系R中属性列上的投影构成,但要满足X属性值在Y上的象集包含S(Y)的条件。
- 象集的本质是一次选择行的运算和一次选择列的运算
- 求x1在表A中的象集,就是先选出所有x属性中x=x1的那些行,然后选择出不包含x1的那些列
R ÷ \div ÷S除法三步走:
1. 找出表S中与R属性相同的那些列,抽出来
2. 求表R中某个A属性各个不同的x值对应的象集
3. 找到x的所有值,这个x要满足:表S是x的象集的子集,(写关系S在其某些属性B、C上的投影集。找罗列出的某个值对应的象集包含关系S的投影集)这就是R ÷ \div ÷S的结果
例题:
解答:
例题2
小结:
关系运算的练习与感悟
- 找出其中的某一属性——利用投影
- 连接是两种表连接,两表要有公共属性才能连
- 一道题中的目标一般用投影,条件一般用选择
- 否定形式的题直接用 ≠ \neq =是会有问题的
- 问即…又…的题,不能用且( ⋀ \bigwedge ⋀)直接连在一起再运算,但或的可以用( ⋁ \bigvee ⋁)
例如
例2:
选课表
学号 课程号 成绩 1801 C1 80 计算机是一行一行扫描的,据表分析,则若写为 Π 学 号 ( σ 课 程 号 = ‘ C 2 ’ ⋂ 课 程 号 = ‘ C 3 ’ ( 选 课 ) ) \Pi_{学号}(\sigma_{课程号=‘C2’\bigcap课程号=‘C3’}(选课)) Π学号(σ课程号=‘C2’⋂课程号=‘C3’(选课))是
错误的写法
,但若题目为或则可相应的改为并这样写
关系演算
要求元组关系演算会看会写,域理解
- 以数理逻辑中的谓词演算为基础
- 按谓词变元不同进行分类
- 1.元组关系演算:以元组变量为谓词变元的基本对象。如ALPHA语言
- 2.域关系演算 :以域变量为谓词变元的基本对象,如:QBE
元组:某行
域:某列
元组关系演算
一般形式:{t|
Φ
\Phi
Φ(t)},其中t是元组变量,
Φ
\Phi
Φ(t)为元组关系演算公式,t要满足该公式
1.原子公式
(1)R(t);表示t是R的一个元组
(2)t[i]
θ
\theta
θu[j];其中
θ
\theta
θ比较运算符,t[i]
θ
\theta
θu[j]表示t元组的第i个分量与u元组的第j个分量满足比较符
θ
\theta
θ条件
(3)t[i]
θ
\theta
θc或c
θ
\theta
θt[i];表示t元组的第i个分量与常量c满足比较符
θ
\theta
θ条件
上题中公式的含义:存在读者任意借阅…
- 其中u[1]=v[1]表示借阅表和读者表,两表自然连接;
- v[2] ≠ \neq =‘JSJ14001’表示借阅表的第二个分量不等于JSJ14001;
- t[1]=u[1]将该元组的第一分量目标u[1]送给t输出
域关系演算
将原来元组变量换为域变量,按列来看
有三列,关系来自R,第一个分量=d,第三个分量<8
u2=‘JSJ14001’是条件,t1=u1是目标
练习题
实例练习—假设tsxs数据库有3个关系模式:
顾客(顾客编号,姓名,年龄,性别,收货地址)
图书(图书编号,书名,出版社,单价,库存量)
购买(顾客编号,图书编号,购买金额)
1.用关系代数表达式实现下列(1)—(5)小题:
(1)查询顾客姓名为“刘振”的收货地址。
Π 收 货 地 址 ( σ 姓 名 = ′ 刘 振 ′ ( 顾 客 ) ) \Pi_{收货地址}(\sigma_{姓名='刘振'}(顾客)) Π收货地址(σ姓名=′刘振′(顾客))
(2)查询30岁以下女性顾客的信息。
σ 年 龄 < 30 ∧ 性 别 = ′ 女 ′ ( 顾 客 ) \sigma_{年龄<30\wedge性别='女' }(顾客) σ年龄<30∧性别=′女′(顾客)
(3) 查询“use102”购买的图书名称和单价。
Π 书 名 , 单 价 ( σ 顾 客 编 号 = ′ u s e 10 2 ′ ( 购 买 ) ⋈ 图 书 ) \Pi_{书名,单价}(\sigma_{顾客编号='use102'}(购买)\Join 图书) Π书名,单价(σ顾客编号=′use102′(购买)⋈图书)
(4)查询购买了图书“考研冲刺”的顾客姓名。
Π 姓 名 ( σ 书 名 = ′ 考 研 冲 刺 ′ ( 图 书 ) ⋈ 购 买 ⋈ 顾 客 ) \Pi_{姓名}(\sigma_{书名='考研冲刺'}(图书)\Join 购买\Join顾客) Π姓名(σ书名=′考研冲刺′(图书)⋈购买⋈顾客)
(5)查询购买了全部图书的顾客编号。
Π 顾 客 编 号 , 图 书 编 号 ( 购 买 ) ÷ Π 图 书 编 号 ( 图 书 ) \Pi_{顾客编号,图书编号}(购买)÷ \Pi_{图书编号}(图书) Π顾客编号,图书编号(购买)÷Π图书编号(图书)
2.用元组关系演算实现下列小题:
(6)查询50岁以上性别为“男”的顾客姓名。
{ t ∣ ( ∃ u ) ( 顾 客 ( u ) ∧ u [ 3 ] > 50 ∧ u [ 4 ] = ′ 男 ′ ∧ t [ 1 ] = u [ 2 ] ) } \{t|(\exists u)(顾客(u)\wedge u[3]>50 \wedge u[4]='男'\wedge t[1]=u[2])\} {t∣(∃u)(顾客(u)∧u[3]>50∧u[4]=′男′∧t[1]=u[2])}
(7)查询“use102”购买的图书名称和单价。
{ t ∣ ( ∃ u ) ( ∃ v ) ( 图 书 ( u ) ∧ 购 买 ( v ) ∧ u [ 1 ] = v [ 2 ] ∧ v [ 1 ] = ′ u s e 10 2 ′ ∧ t [ 1 ] = u [ 2 ] ∧ t [ 2 ] = u [ 4 ] ) } \{t|(\exists u)(\exists v)(图书(u)\wedge 购买(v)\wedge u[1]=v[2]\wedge v[1]='use102'\wedge t[1]=u[2]\wedge t[2]=u[4])\} {t∣(∃u)(∃v)(图书(u)∧购买(v)∧u[1]=v[2]∧v[1]=′use102′∧t[1]=u[2]∧t[2]=u[4])}