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
2
3
SELECT Departure_time 
FROM Flights
WHERE destination = 'Detroit';
  • 功能: 该 SQL 查询从 Flights 表中选取所有目的地为 'Detroit' 的航班的出发时间(Departure_time)。
  • 解释:
    • SELECT:选择你想要查询的字段(这里是 Departure_time)。
    • FROM:指定查询的数据来源表(这里是 Flights)。
    • WHERE:用来添加过滤条件,这里是筛选目的地为 'Detroit' 的记录。

2. 查询数学系教授的教学时间安排:

1
2
3
SELECT professor, time 
FROM teaching_assignments, class_schedule
WHERE department = 'mathematics';
  • 功能: 该 SQL 查询从 teaching_assignmentsclass_schedule 表中获取数学系(department = 'mathematics')的所有教授(professor)和对应的上课时间(time)。
  • 解释:
    • SELECT:选择你要查询的字段(这里是 professortime)。
    • FROM:指定查询的表格,这里是连接了两个表(teaching_assignmentsclass_schedule)。
    • WHERE:过滤条件,这里是筛选出数学系的记录。

说明:

  • SELECT:用于指定需要查询的列或字段。
  • FROM:指定查询的数据源表。
  • WHERE:用于指定查询条件,过滤满足条件的记录。
  • 连接(JOIN):在第二个查询中,虽然没有明确使用 JOIN 语句,但 SQL 默认会对多个表进行笛卡尔积的连接。更规范的写法是使用显式的 JOIN 来明确连接条件。例如:
1
2
3
4
SELECT professor, time 
FROM teaching_assignments
JOIN class_schedule ON teaching_assignments.course_id = class_schedule.course_id
WHERE department = 'mathematics';

在这种写法中,我们通过 JOIN 将两个表连接起来,并用 ON 指定连接条件,保证数据的准确性。

应用

image-20241121151724293

1. 检索籍贯为福建的学生的姓名、学号和选修的课程号

1
2
3
SELECT 姓名, S.学号, 课程号 
FROM SC, S
WHERE 籍贯 = '福建' AND S.学号 = SC.学号;

2. 检索选修了全部课程的学生的姓名和年龄

1
2
3
SELECT 姓名, 年龄 
FROM S, C, SC
WHERE C.课程号 = SC.课程号 AND S.学号 = SC.学号;