【数据库基础】关系代数之除法
除法运算的定义:除法运算 ÷\div÷ 是同时从关系的水平和垂直方向进行运算。给定关系 R(X,Y)R(X,Y)R(X,Y) 和 S(Y,Z)S(Y,Z)S(Y,Z),X,Y,ZX,Y,ZX,Y,Z 为属性组。R÷SR \div SR÷S 为:元组在 XXX 上的分量值 xxx 的 像集 YxY_xYx ,包含 关系 SSS 在属性组 YYY 上投影 πy(S)\pi_y(S)πy(S) 的.
除法运算的定义:除法运算 ÷ \div ÷ 是同时从关系的水平和垂直方向进行运算。
给定关系
R
(
X
,
Y
)
R(X,Y)
R(X,Y) 和
S
(
Y
,
Z
)
S(Y,Z)
S(Y,Z),
X
,
Y
,
Z
X,Y,Z
X,Y,Z 为属性组。
R
÷
S
R \div S
R÷S 为:元组在
X
X
X 上的分量值
x
x
x 的 像集
Y
x
Y_x
Yx ,包含 关系
S
S
S 在属性组
Y
Y
Y 上投影
π
y
(
S
)
\pi_y(S)
πy(S) 的 集合。形式定义:
R
÷
S
=
{
t
n
[
X
]
∣
t
n
∈
R
∧
π
y
(
S
)
⊆
Y
x
}
R \div S = \{\ t_n[X]\quad |\quad t_n \in R \wedge \pi_y(S) \subseteq Y_x\}
R÷S={ tn[X]∣tn∈R∧πy(S)⊆Yx}
这个概念非常抽象,我反正是没有听懂的。所以,这里通过一个实例来说明除法运算的求解过程:
设有关系
R
、
S
R、S
R、S 如图所示,求
R
÷
S
R÷S
R÷S 的结果:
求解步骤过程:
-
第一步:找出被除关系 R R R 和关系 S S S 中 相同的属性列,即 Y Y Y 属性。关系 S S S 中对 Y Y Y 做投影(即将 Y Y Y 无重复的列举出);所得结果如下:
-
第二步:找出被除关系 R R R 中与 S S S 中不相同的属性列,即 X X X 属性。关系 R R R 中对 X X X 做投影(即将 X X X 无重复的列举出);所得结果如下:
-
第三步:求关系 R R R 中 X X X 属性对应的 像集 Y Y Y。根据关系 R R R 的记录,可以得到与 X 1 X_1 X1 值有关的记录,如图3所示,与 X 2 X_2 X2 有关的记录,如图4所示:
-
第四步:判断包含关系。 R ÷ S R÷S R÷S 其实就是判断关系 R R R 中 X X X 各个值 x x x 的像集 Y x Y_x Yx 是否包含关系 S S S 中属性 Y Y Y 的所有值。对比即可发现:
- X 1 X_1 X1 的像集只有 Y 1 Y_1 Y1,不能包含关系 S S S 中属性 Y Y Y 的所有值,所以排除掉 X 1 X_1 X1;
- X 2 X_2 X2 的像集包含了关系 S S S 中属性 Y Y Y 的所有值,所以 R ÷ S R÷S R÷S 的最终结果就是 X 2 X_2 X2。
也许现在有点明白除法运算是如何操作的了,下面来引申一下,除法运算可以解决什么问题呢?
e
.
g
.
e.g.
e.g. 设有关系
R
,
S
R,S
R,S 以及
R
S
RS
RS,如图所示,求
R
S
÷
S
RS÷S
RS÷S 的结果:
重复一遍上面的求解过程:
- 找到 关系 R S RS RS 和 S S S 中相同的属性列 课 程 名 课程名 课程名,即为 Y Y Y 属性,对其投影,得到 π 课 程 名 ( R S ) = { 语 文 , 数 学 } \pi_{课程名}(RS) = \{语文, 数学\} π课程名(RS)={语文,数学}。
- 找到关系 R S RS RS 中和 S S S 不相同的属性列 学 生 名 学生名 学生名,即为 X X X 属性,对其投影,得到 π 学 生 名 ( R S ) = { 张 三 , 李 四 } \pi_{学生名}(RS) = \{张三, 李四\} π学生名(RS)={张三,李四}。
- 对于 X X X 属性中的每一个分量值 x x x,有像集 Y x Y_x Yx:张三的像集为 { 语 文 , 数 学 } \{语文, 数学\} {语文,数学};李四的像集为 { 语 文 } \{语文\} {语文}。
- 判断包含关系,只有张三包含了关系 S S S 中的属性 Y Y Y 的所有值,因此求得结果为: { 张 三 } \{张三\} {张三}。
所以,可以容易看出来 R S ÷ S RS÷S RS÷S 在这里解决的问题就是:“得到选修了所有课程的学生”。 R S ÷ S RS÷S RS÷S 的意义就是:“在 R R R 和 S S S 的联系 R S RS RS 中,找出与 S S S 中 所有的元组有关系 的 R R R 元组”。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)