Lec5 Relations(2)
Lec5 Relations(2)
我认为这一章是最难的,图论和树论那里都很简单,一开始的逻辑那里其实感觉比较多。
就把你放到最后解决好了,关系!😎
n元关系 (n-ary Relation)
在集合 $ A_1, A_2, , A_n $ 上的一个 n元关系 $ R $ 是集合 $ A_1 A_2 A_n $ 的一个子集。换句话说,$ R $ 是这些集合的笛卡尔积的一个子集。
定义
- 设 $ R A_1 A_2 A_n $,那么 $ R $ 就是一个
n元关系,其中:
- $ A_1, A_2, , A_n $ 是关系 $ R $ 的 域。
- $ R $ 的 度为 $ n $,即它是一个 n元关系。
功能性 (Functional Relation)
如果关系 $ R $ 在某个域 $ A_i $ 上是 功能性的,则对于域 $ A_i $ 中的每个元素 $ a_i $,关系 $ R $ 中最多包含一个包含 $ a_i $ 的元组(n-元组)。
更形式化地,$ R $ 在域 $ A_i $ 上是功能性的,当且仅当对于任意的元组 $ (a_1, a_2, , a_n) R $,其中 $ a_i $ 是 $ A_i $ 中的元素,$ R $ 中只会有一个元组包含 $ a_i $ 作为其中的第 $ i $ 个元素。
进一步推广:多个域上的功能性
可以进一步推广到多个域上:如果关系 $ R $ 在多个域的组合上是功能性的,那么对于这些组合中的每个元素,关系 $ R $ 中也最多只包含一个元组,其中包含这些元素。
例如,关系 $ R $ 在 $ A_i $ 和 $ A_j $ 上是功能性的,意味着对于 $ A_i $ 中的每个元素 $ a_i $ 和 $ A_j $ 中的每个元素 $ a_j $,关系 $ R $ 中最多只有一个元组 $ (a_1, a_2, , a_n) $,使得第 $ i $ 和第 $ j $ 个元素分别是 $ a_i $ 和 $ a_j $。
关系数据库 (Relational Databases)
关系数据库本质上就是一组关系(relations)。这些关系是数据库中的数据结构,它们通过表格的形式展现。
域(Domain)与主键(Primary Key)
- 域 $ A_i $ 是数据库中的一个数据集。如果关系 $ R $ 在域 $ A_i $ 上是功能性的(functional),那么 $ A_i $ 就是数据库的主键。
- 复合键(Composite Key) 是一组域的集合 $ {A_i, A_j, } $,它们满足以下条件:关系 $ R $ 中对于每个组合值 $ (a_i, a_j, ) A_i A_j $,最多只包含一个 n-元组 $ (, a_i, a_j, ) $。
选择操作(Selection Operator)
设 $ A = A_1 A_2 A_n $ 是一个 n-元域,并且定义一个条件 $ C: A {T, F} $,该条件对 $ A $ 中的每个元素(n-元组)进行判断。
选择操作 $ s_C $ 是一个操作符,它将任何 n-元关系 $ R $ 映射到一个新的关系,新的关系包含了所有满足条件 $ C $ 的 n-元组。具体来说,选择操作 $ s_C(R) $ 是:
$ s_C(R) = { a R C(a) = T } $
这意味着选择操作会从原关系 $ R $ 中选出那些满足条件 $ C $ 的元素(n-元组)。
示例:学生信息数据库
假设有一个学生信息数据库,其域定义为:
$ A = $
其中,Standing
表示学生的年级(例如:freshman,
sophomore, junior, senior)。
定义条件
我们可以定义一个条件
UpperLevel
,它用于筛选出大三和大四的学生。该条件可以表示为:
$ $
即,UpperLevel
条件判断学生是否是大三(junior)或大四(senior)。
选择操作应用
选择操作 $ s_{} $ 是根据 UpperLevel
条件对关系 $ R $
进行筛选的操作。它会从学生数据库中选出所有年级为大三或大四的学生。例如,假设数据库
$ R $ 包含所有学生的年级信息,那么:
$ s_{}(R) = { } $
这样,通过选择操作,我们得到了一个只包含大三和大四学生的关系(数据库)。
投影操作符(Projection Operators)
定义:
假设 $ A = A_1 A_2 A_n $ 是一个 n-元域,并且 $ {i_k} = (i_1, i_2, ,
i_m) $ 是一个索引序列,其中 $ 1 i_k n $ 对于所有 $ 1 k m $。
那么,投影操作符在 n-元组上的定义为:
它将每个
n-元组映射到其按指定索引子集投影的结果。具体来说,投影操作从原始的
n-元组中选择指定的元素构成新的元组。
示例:三元域(Cars)
假设我们有一个三元域(3-元域):
$ = $
这里,$ n = 3 $,即每个元组有三个元素:Model(车型)、Year(年份)、Color(颜色)。
投影操作:
考虑索引序列 $ {i_k} = 1, 3 $,即我们选择第 1 个和第 3 个元素(Model 和 Color)。在这种情况下,投影操作 $ P $ 将每个三元组 $ (a_1, a_2, a_3) = (, , ) $ 映射到其图像,即:
$ P(a_1, a_2, a_3) = (a_1, a_3) = (, ) $
投影操作的结果是,所有的汽车数据将仅包含车型和颜色,而不包括年份。
应用场景:
这个投影操作可以方便地应用于整个关系 $ R $(例如,存储汽车数据库的关系),从而获得所有可用的车型和颜色组合。例如,假设数据库 $ R $ 中存储了所有汽车的信息,通过投影操作 $ P $,我们可以得到一个只包含“车型”和“颜色”的列表。
连接操作(Join Operators)
定义:
投影操作还可以与连接操作结合使用,连接操作通常用于将两个关系结合起来形成一个复合关系。
假设 $ R_1 $ 和 $ R_2 $ 是两个关系:
- $ R_1 $ 可能是一个讲师和课程之间的教学分配表。
- $ R_2 $ 可能是一个与课程相关的教室、时间分配表。
连接操作 $ J(R_1, R_2) $ 可以用来将这两个表连接在一起,形成一个新的复合关系。假设 $ R_1 $ 中的元组是 $ (A, B) $ 和 $ R_2 $ 中的元组是 $ (B, C) $,那么它们的连接结果是一个新元组 $ (A, B, C) $,并且这个元组出现在连接结果 $ J(R_1, R_2) $ 中。
示例:课程安排表
$ R_1 $ 是一个讲师和课程的分配表:
$ R_1 = { (, ), (, ) } $$ R_2 $ 是一个课程与教室、时间的分配表:
$ R_2 = { (, , ), (, , ) } $
那么,通过连接操作 $ J(R_1, R_2) $,我们可以得到一个包含讲师、课程、教室和时间的完整课堂安排表:
$ J(R_1, R_2) = { (, , , ), (, , , ) } $
这种连接操作就像是你的课程表,其中列出了每个讲师、课程、教室和时间。
SQL 示例
SQL(Structured Query Language,结构化查询语言)用于从关系数据库中查询、插入、更新和删除数据。以下是两个常见的 SQL 查询示例:
1. 查询特定目的地的航班出发时间:
1 | SELECT Departure_time |
- 功能: 该 SQL 查询从
Flights
表中选取所有目的地为'Detroit'
的航班的出发时间(Departure_time
)。 - 解释:
SELECT
:选择你想要查询的字段(这里是Departure_time
)。FROM
:指定查询的数据来源表(这里是Flights
)。WHERE
:用来添加过滤条件,这里是筛选目的地为'Detroit'
的记录。
2. 查询数学系教授的教学时间安排:
1 | SELECT professor, time |
- 功能: 该 SQL 查询从
teaching_assignments
和class_schedule
表中获取数学系(department = 'mathematics'
)的所有教授(professor
)和对应的上课时间(time
)。 - 解释:
SELECT
:选择你要查询的字段(这里是professor
和time
)。FROM
:指定查询的表格,这里是连接了两个表(teaching_assignments
和class_schedule
)。WHERE
:过滤条件,这里是筛选出数学系的记录。
说明:
SELECT
:用于指定需要查询的列或字段。FROM
:指定查询的数据源表。WHERE
:用于指定查询条件,过滤满足条件的记录。- 连接(JOIN):在第二个查询中,虽然没有明确使用
JOIN
语句,但 SQL 默认会对多个表进行笛卡尔积的连接。更规范的写法是使用显式的JOIN
来明确连接条件。例如:
1 | SELECT professor, time |
在这种写法中,我们通过 JOIN
将两个表连接起来,并用
ON
指定连接条件,保证数据的准确性。
应用
1. 检索籍贯为福建的学生的姓名、学号和选修的课程号
1 | SELECT 姓名, S.学号, 课程号 |
2. 检索选修了全部课程的学生的姓名和年龄
1 | SELECT 姓名, 年龄 |