← Back to Learning Notes

Lecture 2:关系数据库

Chinese-language Computer Science 408 note: Lecture 2:关系数据库. Original source available where applicable.

On this page

This note is currently available in Chinese. The original wording, formulas and diagrams are preserved to avoid an unverified technical translation.

描述:本节整理关系模型中的关系、元组、属性和域,严格区分超码、候选码、主码、复合码、全码、外码、主属性与非主属性;随后说明实体/参照/用户定义完整性,以及笛卡尔积、选择、投影、$\theta$ 连接、等值连接和自然连接。

2.1 关系模型基本术语

2.1.1 关系模式

关系模式描述关系的结构,可写为:

$$ R(A_1,A_2,\ldots,A_n). $$

其中:

  • $R$ 是关系名。
  • $A_1,\ldots,A_n$ 是属性名。
  • 每个属性 $A_i$ 都有一个取值域 $D_i$。

例如课件中的学生关系模式:

$$ \operatorname{Student}( \text{学号}, \text{姓名}, \text{性别}, \text{年龄} ). $$

2.1.2 域 Domain

域是一组具有相同数据类型和语义的合法值集合。

例如:

  • 学号域:合法学号字符串。
  • 性别域:系统允许的枚举值。
  • 年龄域:满足范围约束的整数。

课件第一页绿色框“列取值为域”表示同一属性列中的各分量均来自该属性的域。

2.1.3 属性 Attribute

属性对应关系表的一列,用来描述实体的某一特征。

每个属性具有:

  • 属性名。
  • 数据类型或域。
  • 可选的默认值、空值规则和其他约束。

2.1.4 元组 Tuple

元组对应关系表的一行,是各属性值的有序组合:

$$ t=(a_1,a_2,\ldots,a_n), \qquad a_i\in D_i. $$

课件图中学号 803、姓名 王五、性别 男、年龄 20 所在整行就是一个元组。

2.1.5 分量、度与基数

  • 分量:元组在某个属性上的值,例如 王五。
  • 度/目(degree/arity):关系模式的属性个数 $n$。
  • 基数(cardinality):某个关系实例中的元组数。

2.1.6 关系

在关系模型中,关系是笛卡尔积的有限子集:

$$ r(R)\subseteq D_1\times D_2\times\cdots\times D_n. $$

关系模式 $R$ 描述结构,关系实例 $r(R)$ 表示某一时刻实际存在的元组集合。

WARNING · 易错点 关系模式是结构定义,关系实例是当前数据;表只是关系在数据库中的常用实现和显示方式。

2.2 超码与候选码

设关系模式的属性全集为 $U$。

2.2.1 超码 Superkey

若属性集 $K\subseteq U$ 能唯一标识关系中的每个元组,则 $K$ 是超码。

超码只要求唯一性,允许包含多余属性。

如果 EmployeeID 能唯一标识员工,则:

$$ {\text{EmployeeID}} $$

是超码,包含它的:

$$ {\text{EmployeeID},\text{Name}} $$

也仍是超码。

2.2.2 候选码 Candidate Key

候选码是最小超码,同时满足:

  1. 唯一性:能够唯一标识每个元组。
  2. 最小性:删除其中任一属性后都不再具有唯一性。

最小性是集合包含意义上的不可再约简,不是“属性个数在所有码中最少”。

一个关系可以有多个候选码。

2.2.3 主码 Primary Key

从候选码中选定一个作为主码,也称主键或主关键字。

设候选码的集合为 $\mathcal C$,超码的集合为 $\mathcal S$,被选中的主码为 $K_{\text{primary}}$,则:

$$ K_{\text{primary}}\in\mathcal C\subseteq\mathcal S. $$

也就是说,主码是候选码集合中的一个元素,不是候选码集合的子集;每个候选码本身都是一个最小超码。

SQL 中主键满足:

  • 唯一。
  • 每个组成列非空。
  • 一个表只能声明一个 PRIMARY KEY 约束,但该主键可以包含多列。

其余没有被选为主码的候选码称为备用码/替代码(alternate key)。

2.3 复合码与全码

2.3.1 复合码

由两个或多个属性共同组成的候选码或主码,称为复合码/联合码。

课件中的订单明细:

CREATE TABLE OrderDetails (
    OrderID   INT,
    ProductID INT,
    Quantity  INT,
    PRIMARY KEY (OrderID, ProductID)
);

这里:

$$ {\text{OrderID},\text{ProductID}} $$

是复合主码。

2.3.2 全码 All-key

若关系模式的全部属性共同构成一个候选码,则称该候选码为全码。

例如关系:

$$ R(A,B,C) $$

只有属性全集:

$$ {A,B,C} $$

能唯一标识元组,且删除任一属性后都不能唯一标识,则 $ABC$ 是全码。

WARNING · 课件术语纠错 课件把“由多个属性组合而成的主码”称为全码,这是错误的;它应称为复合主码。全码要求码包含关系模式的全部属性。上面的 OrderDetails 还含 Quantity,所以 (OrderID, ProductID) 是复合主码而不是全码。

2.4 主属性与非主属性

2.4.1 主属性

只要某属性属于任意一个候选码,它就是主属性。

2.4.2 非主属性

不属于任何候选码的属性是非主属性。

课件员工表:

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    Email      VARCHAR(100) UNIQUE,
    Name       VARCHAR(50),
    Department VARCHAR(50)
);

假设 EmployeeID 和 Email 都非空且各自唯一,则候选码为:

$$ {\text{EmployeeID}}, \qquad {\text{Email}}. $$

于是:

  • 主属性:EmployeeID、Email。
  • 非主属性:Name、Department。
  • {EmployeeID, Name} 是超码,但不是候选码,因为 Name 多余。
  • {Email, Department} 也是超码,但不是候选码。

NOTE · SQL 口径 标准 SQL 中 UNIQUE 通常允许空值,且不同 DBMS 对多个 NULL 的处理可能不同。要把 Email 严格当作关系理论中的候选码,还应声明 NOT NULL。

2.5 外码

2.5.1 定义

若关系 $R$ 的属性集 $F$ 引用关系 $S$ 的候选码 $K$,则 $F$ 是 $R$ 的外码(Foreign Key)。

被引用关系可以是另一个关系,也可以是 $R$ 自身。

外码用于建立关系之间的联系,但外码值不要求在引用表中唯一。

2.5.2 SQL 例子

CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    Name       VARCHAR(50)
);

CREATE TABLE Orders (
    OrderID    INT PRIMARY KEY,
    OrderDate  DATE,
    CustomerID INT,
    FOREIGN KEY (CustomerID)
        REFERENCES Customers(CustomerID)
);

其中:

  • Customers.CustomerID 是被引用码。
  • Orders.CustomerID 是外码。
  • 多个订单可以引用同一客户。
  • 若外码列允许空,则没有客户的订单可暂时取 NULL;若业务不允许,应再加 NOT NULL。

WARNING 外码引用的是被引用关系中的候选码/唯一键,不一定只能引用被选定的主码;但引用列必须满足 DBMS 对唯一性的要求。

2.6 各种码的包含关系

课件第二页的同心结构应按概念理解:

属性集合
└─ 超码:能够唯一标识元组
   └─ 候选码:最小超码
      └─ 主码:被选中的一个候选码

还需补充:

  • 主属性不是候选码集合本身,而是出现在任一候选码中的单个属性。
  • 外码与上述“唯一标识本关系”的包含链不同,它承担跨关系引用。
  • 全码是一个特殊候选码:候选码恰好由全部属性组成。

2.7 关系完整性

数据库完整性指数据的正确性、有效性和相容性。

关系模型的完整性约束包括实体完整性、参照完整性和用户定义完整性。

2.7.1 实体完整性

实体完整性要求主码能够稳定标识每个实体:

  • 主码值唯一。
  • 主码的任何组成属性都不能为 NULL。

中国数据库教材常把规则表述为“基本关系的主属性不能取空值”;SQL 实现中最直接、强制的规则是 PRIMARY KEY 各列非空且唯一。

2.7.2 参照完整性

若 $F$ 是关系 $R$ 的外码,引用关系 $S$ 的候选码 $K$,则 $R$ 中每个外码值必须:

  1. 等于 $S$ 中某个现有元组的 $K$ 值;或
  2. 在允许空值时取 NULL,表示未知或不适用。

删除或修改被引用元组时,可配置:

  • 拒绝操作(RESTRICT/NO ACTION)。
  • 级联更新或删除(CASCADE)。
  • 把外码置空(SET NULL)。
  • 设置默认值(部分 DBMS 支持)。

2.7.3 用户定义完整性

用户定义完整性是特定业务的语义约束,例如:

  • UNIQUE:值唯一。
  • NOT NULL:不允许空值。
  • DEFAULT:缺省值。
  • CHECK:条件检查。
  • 触发器或应用级复杂约束。

2.7.4 两个不变性

实体完整性和参照完整性是关系模型必须满足的基本完整性规则;用户定义完整性随业务而变化。

2.8 关系代数概览

传统集合运算包括并、差、交和笛卡尔积;专门的关系运算包括选择、投影、连接、除等。

本课件重点讲:

  • 笛卡尔积。
  • 选择。
  • 投影。
  • $\theta$ 连接。
  • 等值连接。
  • 自然连接。

关系代数采用集合语义,结果仍是关系,具有闭包性。

2.9 笛卡尔积

设:

$$ R\subseteq D_1\times\cdots\times D_r, \qquad S\subseteq E_1\times\cdots\times E_s. $$

笛卡尔积为:

$$ R\times S

{(t_R,t_S)\mid t_R\in R,\ t_S\in S}. $$

若:

$$ |R|=m, \qquad |S|=n, $$

则:

$$ |R\times S|=mn. $$

结果的属性数为:

$$ \deg(R\times S)=\deg(R)+\deg(S). $$

课件图中一个 2 行关系与一个 2 行关系做笛卡尔积,得到 4 行;纯笛卡尔积只枚举所有组合,通常没有直接业务含义。

若两关系有同名属性,需要用关系名前缀区分。

2.10 选择

选择(Selection)按条件筛选元组:

$$ \sigma_F(R)

{t\mid t\in R\land F(t)}. $$

课件从学生关系中选择女生:

$$ \sigma_{\text{Ssex}='女'}(\text{Student}). $$

结果只保留赵六所在元组。

选择的特点:

  • 横向筛选行。
  • 属性列不变。
  • 结果元组数不超过原关系。

2.11 投影

投影(Projection)选择指定属性列:

$$ \pi_{A_1,A_2,\ldots,A_k}(R). $$

课件例子:

$$ \pi_{\text{Sno},\text{Sname}}(\text{Student}). $$

投影的特点:

  • 纵向选择列。
  • 结果度数为 $k$。
  • 关系代数采用集合语义,投影后重复元组要消除。

若只投影年龄,原表多行年龄都为 20,结果中只保留一个 (20) 元组。

NOTE SQL 默认是多重集合语义,SELECT Age 会保留重复行;要对应关系代数投影,应使用 SELECT DISTINCT Age。

2.12 $\theta$ 连接

$\theta$ 连接是在笛卡尔积上按比较条件筛选:

$$ R\bowtie_{A\ \theta\ B}S

\sigma_{R.A\ \theta\ S.B}(R\times S), $$

其中:

$$ \theta\in{=,\ne,<,\le,>,\ge}. $$

课件第六页“姓名-分数”与“分数线-等级”的例子使用:

$$ \text{分数}>\text{分数线}. $$

系统先形成组合,再保留满足比较关系的元组。例如分数 75 可与分数线 60 匹配,但不能与 80 匹配。

2.13 等值连接

等值连接是 $\theta$ 连接中 $\theta$ 为等号的特殊情况:

$$ R\bowtie_{R.A=S.B}S

\sigma_{R.A=S.B}(R\times S). $$

课件学生表与教师表按:

$$ R.\text{教师号}=S.\text{教工号} $$

连接。

过程:

  1. 概念上形成 $R\times S$。
  2. 保留连接属性值相等的元组。

结果中通常同时保留 教师号 与 教工号 两个连接列。

WARNING 等值连接不是“去列、去值相同的行”。它是按相等条件筛选笛卡尔积元组;是否删除重复连接列是自然连接与等值连接的重要区别。

2.14 自然连接

自然连接自动对两个关系中所有同名属性做等值匹配,并在结果中只保留一份同名属性:

$$ R\bowtie S. $$

课件过程可整理为:

  1. 找出两个关系的同名属性组。
  2. 保留这些属性值全部相等的元组组合。
  3. 删除重复的同名属性列。

自然连接与等值连接对比:

维度 等值连接 自然连接
条件 显式指定任意属性相等 自动使用全部同名属性
属性名 可不同 必须同名
重复连接列 通常保留 只保留一份
风险 条件明确 新增同名属性可能改变结果

若两关系没有同名属性,自然连接退化为笛卡尔积。

WARNING 自然连接的同名属性会全部参与匹配,实际 SQL 中常优先显式写 JOIN ... ON ...,避免无意同名列改变语义。

2.15 各运算对行列的影响

运算 行数 列数 核心作用
笛卡尔积 $ R
选择 不增加 不变 横向筛选行
投影 可能因去重减少 减少或不变 纵向选择列
$\theta$ 连接 不超过笛卡尔积 通常为列数之和 按比较条件匹配
等值连接 不超过笛卡尔积 通常保留两连接列 按等号匹配
自然连接 不超过笛卡尔积 去掉重复同名列 同名属性等值匹配

2.16 易错点

  • 超码只要求唯一,候选码还要求最小;候选码是最小超码。
  • 主码是被选中的候选码,一个关系可以有多个候选码但只选一个主码。
  • 复合码由多个属性组成;全码必须包含关系模式的全部属性,两者不能混用。
  • 主属性属于任意候选码,不是只属于已选主码。
  • 外码不要求在引用表中唯一,它引用被引用关系的候选码/唯一键。
  • SQL 的 UNIQUE 允许 NULL 的规则因 DBMS 而异,理论候选码不能含未知值。
  • 实体完整性保证主码非空且唯一;参照完整性保证外码为空或匹配被引用码。
  • 笛卡尔积行数相乘、列数相加。
  • 选择筛行不改列,投影选列并在关系代数集合语义下去重。
  • $\theta$ 连接是带任意比较符的连接,等值连接只是其中等号情况。
  • 等值连接通常保留两边连接列,自然连接自动匹配全部同名属性并删除重复列。
  • SQL 默认保留重复行,与纯关系代数集合语义不同。

相关知识

2.17 本节复盘

  • 关系模式由关系名、属性和域组成;元组是关系中的一行,关系是笛卡尔积的有限子集。
  • 超码唯一标识元组,候选码是最小超码,主码是选定候选码,其余候选码为替代码。
  • 复合码强调多个属性联合,全码强调候选码包含全部属性。
  • 主属性出现在任一候选码中,非主属性不属于任何候选码。
  • 外码引用另一关系或本关系的候选码,用于建立关系并维护参照完整性。
  • 实体完整性、参照完整性是关系模型基本规则,用户定义完整性表达具体业务要求。
  • 笛卡尔积生成全部组合,选择筛选行,投影选择列并按集合语义去重。
  • $\theta$ 连接是在笛卡尔积上按比较条件选择,等值连接使用等号,自然连接自动匹配同名属性并去重连接列。