数据库系统

关系数据库模型

概念 内容
关系数据模型 用于描述数据的符号语言,它包括结构、操作和约束等3个部分。
关系(Relation) 二维的表格
属性(Attribute) 关系列的表头,描述了该列内容的实际含义
模式(Scheme) 关系与其属性的范式
元组(Tuples) 关系的具体内容
域(Domains) 关系的数据类型
键(Key) 关系的其中一个元素

关系数据模型

关系代数(RA)

关系代数用于在关系数据模型上查询和修改数据,它的输入和输出均为关系,因此可视为一个封闭的代数系统。

SQL语句的核心就是关系代数。

代数(Algebra)是操作数(Operands)和运算符(Operators)的集合。

关系表达式

通过关系代数的运算符和各种关系相连接。可以得到关系表达式。例如:

$$ R(t,y,l,i,s,p) := \sigma_{\mathrm{length} \leqslant 100}(\mathrm{Movies}) $$

$$ S(t,y,l,i,s,p) := \sigma_{\mathrm{studioName='Fox'}}(\mathrm{Movies}) $$

$$ Answer(title, year) := \pi_{t,y}(R \cap S) $$

事实上,所有表达式都可以写成的形式。上式即可表达为:

关系代数表达式

关系运算

集合运算

集合操作 符号 作用
并(Union) $R \cup S$ 关系 $R$ 和 $S$ 中所有的内容,相同的只出现一次
交(Intersection $R \cap S$ 关系 $R$ 和 $S$ 中共同存在的内容
差(Difference $R - S$ 关系 $R$ 中存在但不在关系 $S$ 中
数量 $\mid R \mid$ 关系 $R$ 中所有的元组数目(表的总行数)

对应的SQL语言:

1
2
3
(SELECT * FROM R) UNION (SELECT * FROM S);          -- 并
(SELECT * FROM R) INTERSECT (SELECT * FROM S);      -- 交
(SELECT * FROM R) EXCEPT (SELECT * FROM S);         -- 差

集合运算

集合运算中的关系 $R$ 和 $S$ 的属性必须相同且排列顺序一致,且每个属性在两者中的域(数据类型)必须相同。

投影运算

从关系 $R$ 生成一个仅包含 $R$ 部分属性的新关系(Project),可表示为 $\pi_{A_1, A_2, \cdots, A_n}(R)$

对应的SQL语言:

1
SELECT A1, A2, ..., An FROM R;

投影运算

选择运算

生成关系 $R$ 满足条件 $C$ 的元组子集作为一个新关系,结果关系的模式与原关系的相同(SELECTION)。可表示为:$\sigma_{C}(R)$

用集合表示则可写作:$\sigma_{C}(R) = \{ t | t \in R \land C(t) = \mathrm{true} \}$

对应的SQL语言:

1
SELECT * FROM R WHERE C;

选择运算

笛卡尔积

选择关系 $R$ 的一个元素为有序对的第一个元素,关系 $S$ 的一个元素为第二个元素,以此类推形成的新关系(Cartesian Product)。可表示为:$R \times S$

对应的SQL语言:

1
SELECT * FROM R CROSS JOIN S;

笛卡尔积

自然连接

设 $A_1, A_2, \cdots, A_n$ 为关系 $R$ 和 $S$ 中所有共同属性,当两者的共同属性的内容完全一致时则合并为一个关系,合并的结果应包含关系 $R$ 和 $S$ 中的所有属性(Natural Joins)。可表示为:$R \bowtie S$

对应的SQL语言:

1
SELECT * FROM R NATURAL JOIN S;

自然连接

θ-连接

关系 $R$ 与 $S$ 先做笛卡尔积,在从中选择满足条件 $C$ 的部分(Theta-Joins)。可表示为 $ R \bowtie_{C} S $

对应的SQL语言:

1
SELECT * FROM R INNER JOIN S ON C;

Theta连接

重命名

将关系 $R$ 重命名为关系 $S$,$R$ 中对应的属性重命名为 $A_1, A_2, \cdots, A_n$。可表示为 $\rho_{S(A_1, A_2, \cdots, A_n)}(R)$

对应的SQL语言:

1
SELECT a_1 AS A_1, a_2 AS A_2, ..., a_n AS A_n FROM R AS S;

重命名

依赖

依赖(Dependency)涉及如何构建一个良好的关系数据库模式,以及当一个模式存在缺陷时如何改进的问题,并使用“异常”来指代这些问题。

函数依赖

定义

如果两个元组在属性 $A_1, A_2, \cdots, A_n$ 上一致(即它们对应属性的分量值都相等),那么它们必定在其他属性上 $B_1, B_2, \cdots, B_m$ 上也一致。记作

$$A_1 A_2 \cdots A_n \rightarrow B_1 B_2 \cdots B_m$$

即 $B_1, B_2, \cdots, B_m$ 函数依赖 $A_1, A_2, \cdots, A_n$,或称 $A_1, A_2, \cdots, A_n$ 函数决定 $B_1, B_2, \cdots, B_m$。

若 $A_1 A_2 \cdots A_n \rightarrow B_1 B_2 \cdots B_m$ 成立,则以下各式均成立:

$$\begin{array}{c} A_1 A_2 \cdots A_n \rightarrow B_1 \\ A_1 A_2 \cdots A_n \rightarrow B_2 \\ \cdots \\ A_1 A_2 \cdots A_n \rightarrow B_m \end{array}$$

如果关系 $R$ 的每个实例都满足一个确定的函数依赖 $f$,那么称 $R$ 满足 函数依赖 $f$,即在 $R$ 上声明了一个约束。

关系的键

若属性集 $\{A_1, A_2, \cdots, A_n\}$ 满足:

  1. 它们决定关系的所有其他属性,即关系 $R$ 不可能存在两个不同的元组具备相同的 $A_1, A_2, \cdots, A_n$ 值。
  2. 在 $\{A_1, A_2, \cdots, A_n\}$ 的所有真子集均不能决定关系 $R$ 的所有其他属性,即键必须是最小的。

则称 $\{A_1, A_2, \cdots, A_n\}$ 是关系 $R$ 的

可以将关系 $R$ 中的键类比为 $n$ 维线性空间的一个 $n$ 元向量组 $[\bm{e}_1, \bm{e}_2, \cdots, \bm{e}_n]$,它可以表示该空间内的所有向量。

有时,一个关系可能会有多个可行的键,这时需指定其中一个为主键(Primary key)。

一个包含键的属性集就称为超建

容易得出,每个键都是该关系的超键($A \subseteq A$)

函数依赖的规则

函数依赖的规则给出了推导函数依赖的一般方法。

分解/结合规则

函数依赖 $A_1 A_2 \cdots A_n \rightarrow B_1 B_2 \cdots B_m$ 等价于下列函数依赖的集合:

$$\begin{array}{c} A_1 A_2 \cdots A_n \rightarrow B_1 \\ A_1 A_2 \cdots A_n \rightarrow B_2 \\ \cdots \\ A_1 A_2 \cdots A_n \rightarrow B_m \end{array}$$

从左到右称作函数依赖的分解规则,从右到左称作函数依赖的结合规则。

平凡函数依赖

对于函数依赖 $A_1 A_2 \cdots A_n \rightarrow B_1 B_2 \cdots B_m$,若满足

$$\{B_1 B_2 \cdots B_m\} \subseteq \{A_1 A_2 \cdots A_n\}$$

则称其为 平凡函数依赖

若 $A_1 A_2 \cdots A_n \rightarrow B_1 B_2 \cdots B_m$,且 $\{B_1, B_2, \cdots, B_m\} - \{A_1, A_2, \cdots, A_n\} = \{C_1, C_2, \cdots, C_k\}$,则有

$$A_1 A_2 \cdots A_n \rightarrow C_1 C_2 \cdots C_k$$

这称为平凡依赖规则。如图所示:

平凡依赖规则

属性的闭包

设 $\{A_1, A_2, \cdots, A_n\}$ 是属性集合,$S$ 是函数依赖的集合,则 $S$ 下属性集合 $\{A_1, A_2, \cdots, A_n\}$ 的闭包定义为:满足 $S$ 中所有函数依赖关系的属性集合 $B$,记作 $\{A_1, A_2, \cdots, A_n\}^+$

计算属性闭包的方法:

  1. 设 $X$ 是属性集合 $\{A_1, A_2, \cdots, A_n\}$ 的闭包,首先令 $X = \{A_1, A_2, \cdots, A_n\}$。
  2. 反复寻找函数依赖 $B_1 B_2 \cdots B_n \rightarrow C$ ,使得 $B_1, B_2, \cdots, B_n$ 在 $X$ 中且 $C$ 不再 $X$ 中。然后把 $C$ 加入 $X$。
  3. 重复这个过程,直至无法再添加新的元素到 $X$ 中,计算结束,此时 $\{A_1, A_2, \cdots, A_n\}^+ = X$。

传递规则

若关系 $R$ 满足 $A_1 A_2 \cdots A_n \rightarrow B_1 B_2 \cdots B_m$ 和 $B_1 B_2 \cdots B_m \rightarrow C_1 C_2 \cdots C_k$,则有

$$A_1 A_2 \cdots A_n \rightarrow C_1 C_2 \cdots C_k$$

Armstrong公理

公理 定义
自反律 如果 $\{B_1 B_2 \cdots B_m\} \subseteq \{A_1 A_2 \cdots A_n\}$,那么 $A_1 A_2 \cdots A_n \rightarrow B_1 B_2 \cdots B_m$
增广律 如果 $A_1 A_2 \cdots A_n \rightarrow B_1 B_2 \cdots B_m$,那么 $A_1 A_2 \cdots A_n C_1 C_2 \cdots C_k \rightarrow B_1 B_2 \cdots B_m C_1 C_2 \cdots C_k$
传递律 如果 $A_1 A_2 \cdots A_n \rightarrow B_1 B_2 \cdots B_m$ 且 $B_1 B_2 \cdots B_m \rightarrow C_1 C_2 \cdots C_k$,那么 $A_1 A_2 \cdots A_n \rightarrow C_1 C_2 \cdots C_k$

函数依赖的投影

记 $R_1 = \pi_{L} (R)$,函数依赖集合 $S$ 的投影是满足下列条件的函数依赖的集合:

  1. 从 $S$ 推断而来
  2. 只包含 $R_1$ 的属性

模式设计

关系的分解

将关系进行分解(decompose)可用来消除异常。

给定关系 $R(A_1, A_2, \cdots, A_n)$,把它分解为关系 $S(B_1, B_2, \cdots, B_m)$ 和 $T(C_1, C_2, \cdots, C_k)$,需满足:

  1. $\{A_1, A_2, \cdots, A_n\} = \{B_1, B_2, \cdots, B_m\} \cup \{C_1, C_2, \cdots C_k\}$
  2. $S = \pi_{B_1, B_2, \cdots, B_m} (R)$
  3. $T = \pi_{C_1, C_2, \cdots, C_k} (R)$

BC范式

分解的目的就是将一个关系用多个不存在异常的关系替换,即在一个简单的条件下保证异常不存在,这个条件就称作BC范式(BCNF)。

定义:当且仅当如果关系 $R$ 中非平凡函数依赖 $A_1 A_2 \cdots A_n \rightarrow B_1 B_2 \cdots B_m$ 成立,则 $\{A_1, A_2, \cdots, A_n\}$ 是关系 $R$ 的超键。此时称关系 $R$ 为BC范式。

换言之,就是每个非平凡函数依赖的左侧必须包含该关系的键。

分解为BC范式

目标:将任何一个关系模式分解为带有以下性质的、具有多个属性的子集:

  1. 以这些子集为模式的关系都属于BCNF。
  2. 原始关系中的数据都被正确地反映在分解后的关系上,简单而言就是原始关系应能从分解后的几个关系实例中重构。

对于任意关系 $R$ 和函数依赖集合 $S$,有BCNF分解算法:

  1. 检验 $R$ 是否为BCNF,若是,直接返回 $R$。
  2. 如果存在违反BCNF的函数依赖,假设为 $X \rightarrow Y$。计算 $X$ 的闭包 $X^+$。选择 $R_1 = X^+$ 作为一个关系模式,并使另一个关系模式 $R_2$ 包含属性 $X$ 以及不在 $X^+$ 的属性。
  3. 计算 $R_1$ 和 $R_2$ 的函数依赖集合,记为 $S_1$ 和 $S_2$,并递归地分解 $R_1$ 和 $R_2$,返回最终分解的集合。

例如,对于关系 $R(A, B, C, D)$ 和函数依赖集合 $F = \{AB \rightarrow C, C \rightarrow D, D \rightarrow A\}$:

  1. 检查每个函数依赖是否违反 BCNF:
函数依赖 左侧 左侧闭包 是否违反BCNF
$\{AB \rightarrow C\}$ $AB$ $ABCD$ 是超键,不违反BCNF
$\{C \rightarrow D\}$ $C$ $CDA \ne ABCD$ 不是超键,违反BCNF
$\{D \rightarrow A\}$ $D$ $DA \ne ABCD $ 不是超键,违反BCNF
  1. 选择违反的函数依赖进行分解

对于 $C \rightarrow D$,左侧闭包为 $\{CDA\}$,则分解为关系 $R_1(A, C, D)$ 和 $R_2(B, C)$。其中 $R_2(B,C)$ 已经是 BCNF,因此只需要再分解 $R_1(A, C, D)$

  1. 再次分解 $R_1(A, C, D)$
函数依赖 左侧 左侧闭包 是否违反BCNF
$\{C \rightarrow D\}$ $C$ $CDA$ 是超键,不违反BCNF
$\{D \rightarrow A\}$ $D$ $DA \ne ACD $ 不是超键,违反BCNF

则可以分解为 $R_3(A, D)$,$R_4(C, D)$

综上,BCNF分解为 $(A, D)$,$(B, C)$,$(C, D)$

分解的优劣

一个理想的分解应当具有3个性质:

  1. 消除异常
  2. 信息可恢复:能够从分解后的各个元组中恢复原始关系
  3. 依赖的保持:如果函数依赖的投影在分解后的关系上成立,能确保对分解后的关系用连接重构获取原始关系仍然满足原来的函数依赖

事实上,没有一种分解能同时具备以上3个性质。

从分解中恢复信息

若可以通过分解后的各个关系重构原关系 $R$,则称该分解含有无损连接

设关系 $R(X,Y,Z)$,且具备函数依赖 $X \rightarrow Y$,则可以依据BCNF分解算法将关系分解为 $R_1(X,Y)$ 和 $R_2(Y,Z)$,且

$$R = \pi_{X \cup Y}(R) \bowtie \pi_{Y \cup Z}(R)$$

即该分解包含无损连接。

无损连接的检验

设关系 $R$ 被分解为若干关系,它们的属性集分别为 $S_1, S_2, \cdots, S_k$,在 $R$ 上成立的函数依赖集合为 $F$。则

$$\pi_{S_1}(R) \bowtie \pi_{S_2}(R) \bowtie \cdots \bowtie \pi_{S_k}(R) = R$$

成立当且仅当连接结果中的每个元组都属于 $R$。这称为无损连接的chase检验。

例如,对于关系 $R(A, B, C, D)$ 可分解为以下关系:$\{A, D\}$,$\{A, C\}$ 和 $\{B, C, D\}$。函数依赖为 $A \rightarrow B$,$B \rightarrow C$ 和 $CD \rightarrow A$。则它的无损连接的检验如下:

  1. 构造关系表,在关系中的属性不带下标,否则带下标。

不带下标的属性表明受到约束,反之为自由值。

关系 A B C D
$\{A, D\}$ $a$ $b_1$ $c_1$ $d$
$\{A, C\}$ $a$ $b_2$ $c$ $d_2$
$\{B, C, D\}$ $a_3$ $b$ $c$ $d$
  1. 应用函数依赖 $A \rightarrow B$
关系 A B C D
$\{A, D\}$ $\bm{a}$ $\bm{b_1}$ $c_1$ $d$
$\{A, C\}$ $\bm{a}$ $\bm{b_1}$ $c$ $d_2$
$\{B, C, D\}$ $a_3$ $b$ $c$ $d$
  1. 应用函数依赖 $B \rightarrow C$
关系 A B C D
$\{A, D\}$ $a$ $\bm{b_1}$ $\bm{c}$ $d$
$\{A, C\}$ $a$ $\bm{b_1}$ $\bm{c}$ $d_2$
$\{B, C, D\}$ $a_3$ $b$ $c$ $d$
  1. 应用函数依赖 $CD \rightarrow A$
关系 A B C D
$\{A, D\}$ $a$ $b_1$ $\bm{c}$ $\bm{d}$
$\{A, C\}$ $a$ $b_1$ $c$ $d_2$
$\{B, C, D\}$ $\bm{a}$ $b$ $\bm{c}$ $\bm{d}$
  1. 查找属性为 $\{a, b, c, d\}$ 的元组。若存在,则证明为无损连接。

依赖的保持

在某些情况下,把一个关系分解为一系列BCNF关系时,无法同时拥有无损连接和依赖保持两种性质。

BCNF 不保证依赖保持(dependency preservation)。如果关系分解时要求既满足 BCNF 又保持依赖,有时是不可能的(需要在 BCNF 和 3NF 之间做权衡)。

第三范式

定义:如果一个关系 $R$ 满足只要 $A_1 A_2 \cdots A_n \rightarrow B_1 B_2 \cdots B_m$ 是非平凡函数依赖,那么或者 $\{A_1, A_2 ,\cdots, A_n\}$ 是超键,或者每个属于 $B_1, B_2, \cdots, B_n$ 但不属于 $A$ 的属性都是某个键的成员。

如果一个属性是某个键的成员,则常被成为“主属性”。因此,3NF的条件等价于:对于每个非平凡FD,或者其左边是超键,或者其右边仅由主属性构成。

多值依赖

“多值依赖(MVD)”是两个属性或属性集合之间相互独立的断言,是广义的函数依赖。

定义

在关系 $R$ 中,当给定某个属性集合的值时,存在另外一组属性集合,该组属性的值与关系中所有其他属性的值独立。即若给定 $R$ 中属于 $A$ 的各属性的值,存在一个属性 $B$,其中属性的值独立于 $R$ 中既不属于 $A$ 也不属于 $B$ 的属性集合的值,则称 MVD

$$A_1 A_2 \cdots A_n \rightarrow \rightarrow B_1 B_2 \cdots B_m$$

在 $R$ 中成立

更准确的说法:若MVD成立,则对于 $R$ 中每个在所有 $A$ 属性上一致的元组对 $r$ 和 $u$,能在 $R$ 中找到满足下列条件的元组 $v$:

  1. 在 $A$ 属性上的取值与 $t$ 和 $u$ 相同
  2. 在 $B$ 属性上的取值与 $t$ 相同
  3. 在 $R$ 中不属于 $A$ 和 $B$ 的所有其他属性上的取值与 $u$ 相同

推导

规则 内容
平凡MVD 如果 $\{B_1, B_2, \cdots, B_m\} \subseteq \{A_1, A_2, \cdots, A_n\}$,则MVD $$A_1 A_2 \cdots A_n \rightarrow \rightarrow B_1 B_2 \cdots B_m$$ 在任何关系中均成立
传递规则 如果关系中存在 $A_1 A_2 \cdots A_n \rightarrow \rightarrow B_1 B_2 \cdots B_m$ 和 $B_1 B_2 \cdots B_m \rightarrow \rightarrow C_1 C_2 \cdots C_m$,则有 $$A_1 A_2 \cdots A_n \rightarrow \rightarrow C_1 C_2 \cdots C_m$$ 也成立
互补规则 若关系 $R$ 上存在 MVD:$A_1 A_2 \cdots A_n \rightarrow \rightarrow B_1 B_2 \cdots B_m$,则 $R$ 上也存在 $A_1 A_2 \cdots A_n \rightarrow \rightarrow C_1 C_2 \cdots C_k$,其中 $C$ 是 $R$ 中不属于 $A$ 和 $B$ 的所有其他属性的集合

高级数据库模型

E/R模型

在E/R模型中,数据的结构用图形化方式表示,即“实体——联系图”。它包含以下3个主要的元素类型:实体集、属性、联系。

元素 内容
实体集 实体是某种抽象对象,相似的实体集合形成实体集
属性 实体集具备相关的属性,属性是这个实体集中的实体所具有的性质
联系 联系是两个或多个实体集的连接

考虑电影数据库的设计例子:

  1. 每个电影都是实体,所有电影的集合构成一个实体集。同理,影星的集合、电影公司的集合也构成一个实体集。
  2. 实体集Movies可能有title(电影名)或length(片长)等属性。
  3. MoviesStars是两个实体集,Stars-in就是连接MoviesStars的联系。

E/R图

E/R图是描述实体集、属性和联系的图示。图中每种元素都能用节点表示,并能使用特殊形状的节点来标识特定的类别:

  • 矩形:实体集
  • 椭圆:属性
  • 菱形:联系

用边来连接实体集与它的属性、联系与它的实体集。

例如,电影数据库的E/R图如下:

电影数据库的E/R图

实际上,属性也可以直接与联系相连。但是也可以创建一个新的、包含该属性实体集与联系相连。

一个有属性的联系

E/R图是一种描述数据库模式的符号,一个用E/R图描述的数据库包含特定的数据,称为数据库实例。对于每个实体集,数据库实例有一个特定的有限实体集合,实体集中的每个实体对每个属性都有特定的值。

$R$ 的联系集:$n$ 个实体集 $E_1, E_2 \cdots, E_n$ 的联系 $R$ 的一个实例由元组 $(e_1, e_2, \cdots, e_n)$ 的有限实体构成,其中 $e_i$ 都从实体集 $E_i$ 的当前实例选出。

二元联系

联系的分类 定义
多对一 $E$ 中的任意一个实体可以通过 $R$ 与 $F$ 中的至多一个实体联系。反过来,$F$ 中的每个实体都能与 $E$ 中的许多实体联系
一对一 $R$ 既是从 $E$ 到 $F$ 的多对一联系,又是从 $F$ 到 $E$ 的多对一联系
多对多 $R$ 既不是从 $E$ 到 $F$ 的多对一联系,也不是从 $F$ 到 $E$ 的多对一联系

在E/R图中,可以用箭头表示E/R图中的多种联系:若实体集 $E$ 到 $F$ 是多对一联系,则用箭头指向 $F$。

箭头的含义是“最多一个”,可能并不存在符合条件的联系集。

多路联系

E/R图中的多路联系由联系菱形到它设计的每个实体集的连线表示。

在多路联系中,指向实体集 $E$ 的箭头表示:如果从该联系的其他每个实体集中选择一个实体,它们至多与 $E$ 中的一个实体联系。

通俗地,可以认为是右边为 $E$ 和联系中所有其他实体集在左边的函数依赖。

联系中的角色

在一个联系集中,一个实体集可能出现两次或多次。此时则需要根据实体集在联系中出现的次数,将联系与实体集通过同样多的连线相连。其中,每一条连向实体集的连线代表实体集在联系中扮演的不同角色。

角色(role)定义为实体集与联系之间的边的命名。

子类

如果一个实体集中包含一些实体,且它们拥有集合中其他实体成员没有的特殊性质,那么就可以定义一些特例实体集或子类。每个子类都有它自己特殊的属性和联系。

用 $\text{isa}$ 连接实体集和它的子类,并使用三角形表示:三角形的一边与子类相连,与此边相对的一角与父类相连。每个 $\text{isa}$ 都是一对一联系。

isa联系

设计原则

原则 要求
忠实性 设计应当忠实于应用的具体要求
避免冗余 不要重复表达
简单性 不要在设计中添加更多成分

E/R模型中的约束

实体集 $E$ 的键是由一个或多个属性的集合 $K$,对于来自 $E$ 的不同实体 $e_1$ 和 $e_2$,它们对键 $K$ 中的属性没有完全相同的值。

键的特点:

  1. 每个实体集必须有一个键。
  2. 一个实体集可以有多个键。
  3. 当一个实体集有 $\text{isa}$ 联系时,要求根实体集拥有键所需的所有属性,并且每个实体集的键都可以在根实体集中发现它的组成部分。

在E/R图中,实体集的键用下划线标出。

引用完整性

假设 $R$ 是从实体集 $E$ 到实体集 $F$ 的联系,如果用圆箭头指向 $F$ 表示此联系从 $E$ 到 $F$ 不仅是多对一或一对一,而且要求与给定的 $E$ 实体相联系的 $F$ 必须存在。

度约束

在E/R模型中,可以在连接一个联系到一个实体的边上加一个数字,表示相关实体集中任意实体可被联系到的实体数目。

弱实体集

若一个实体集键是由另一个实体集的部分或全部属性构成,则这样的实体集称为弱实体集。

弱实体集的要求

如果 $E$ 是弱实体集,则它的键组成为:

  1. 零个或多个它自己的属性。
  2. 从 $E$ 到其他实体集的多对一联系连接的键属性。这些多对一联系称为 $E$ 的支持联系,从 $E$ 到达的实体集称为支持实体集。

弱实体集的符号

如果一个实体集是弱实体集,则可以表示为双边的矩形,它所支持的多对一联系表示为双边的菱形。

从E/R图到关系设计

把每个实体集转换成具有相同属性的关系;把联系转换成关系,关系属性来自参与实体集的键

网站总访客数:Loading

使用 Hugo 构建
主题 StackJimmy 设计