###Relational Algebra - Division
关系代数中的除法一般用来解决涉及“所有”这一关键词的问题。对于关系r和s,
r
÷
s
\ r \div s
r÷s 即是找到所有与【所有s中的元组】有联系的r中的元组。换个说法的话就是:找到所有这样的【关系r的元组】,它和每一个关系s中的元组都有联系。
比如有如下两个关系
Taken (StudentID, CourseID)
Course (CourseID)
Taken
表记录学号为StudentID的学生选修了课程编号为CourseID的课程。
Course
表记录了CourseID(省略了课程名称之类的信息,简化问题)
要找到所有选修了所有课程的学生,就适合用除法来做。
通过除法的定义式来体会一下其工作过程。
r
÷
s
=
π
R
−
S
(
r
)
−
π
R
−
S
(
(
π
R
−
S
(
r
)
×
s
)
−
r
)
\ r \div s = \pi_{R-S}(r) - \pi_{R-S}((\pi_{R-S}(r) \times s) - r)
r÷s=πR−S(r)−πR−S((πR−S(r)×s)−r)
对于上面的例子
r = Taken, s = Course
R = {StudentID, CourseID}
S = {CourseID}
考虑这样的数据
Taken =
|StudentID|CourseID|
|--|--|
|11|a|
|11|b|
|11|c|
|22|a|
|33|b|,
Course =
|CourseID|
|-|
|a|
|b|
|c|
π R − S ( r ) × s \pi_{R-S} ( r) \times s πR−S(r)×s 得到的是所有StudentID和所有CourseID的笛卡尔乘积。
|StudentID|CourseID|
|--|--|
|11|a|
|11|b|
|11|c|
|22|a|
|22|b|
|22|c|
|33|a|
|33|b|
|33|c|
π R − S ( ( π R − S ( r ) × s ) − r ) \pi_{R-S}((\pi_{R-S} (r) \times s) - r) πR−S((πR−S(r)×s)−r) 得到的是在上一步的结果中去掉r自身所有的元组,然后再对R-S属性集投影。换句话说,就是所有理论上存在的StudentID和CourseID的组合中,不在实际情况中的组合,我们取这样的组合的StudentID。也就是没有选修所有课程的学生。
内层的差运算结果:
|StudentID|CourseID|
|--|--|
|22|b|
|22|c|
|33|a|
|33|c|
投影结果:
|StudentID|
|--|
|22|
|33|
π R − S ( r ) − π R − S ( ( π R − S ( r ) × s ) − r ) \pi_{R-S}(r) - \pi_{R-S}((\pi_{R-S}(r) \times s) - r) πR−S(r)−πR−S((πR−S(r)×s)−r) 最后一步用减法得到所有选修了所有课程的学生。