数据库
数据库系统设计部分
键(Key)
- 主键(Primary Key)
- 候选键(Candidate Key):满足唯一性且具备最小性,属性不允许冗余。
- 超键(Super Key):满足唯一性即可,不要求最小性。
外键约束(Foreign Key Constraint)
- 外键(Foreign Key):某关系中的属性(组)必须在另一关系的主键或候选键中出现。
- 参照完整性(Referential Integrity):外键取值必须能在参照关系的候选键中找到,或取
NULL。
概念模型
- 实体(Entity):具备独立存在意义的事物,可具体(学生、课程)也可抽象(成绩单)。
- 属性(Attribute):实体的特征或性质。
- 实体集(Entity Set):同类实体的集合。
- 强实体集:可独立存在,拥有自己的主键。
- 弱实体集:依赖其他实体,不具主键(数据库中常对应从表)。
- 关系(Relationship):实体之间的联系,例如学生选课。
- 关系集(Relationship Set):同类关系的集合。
约束
- 基数(Cardinality):描述实体间关系数量。
- 一对一(1:1)
- 一对多(1:N)
- 多对多(M:N)
E-R 图与关系模型映射
| E-R 概念 | 转换后数据库对象 |
|---|---|
| 实体集 | 表(Table) |
| 属性 | 列(Column) |
| 关系集 | 外键或中间表 |
| 主键 | 主键约束(Primary Key) |
转化策略
- 实体集 → 表,属性 → 列。
- 关系转换:
- 1:1:任选一侧添加外键指向另一侧主键。
- 1:N:在 “多” 端添加外键指向 “一” 端主键。
- M:N:创建中间表,包含两端主键并联合为主键。
Normalization
目标:对模式 $R$ 消除冗余且保持语义。
正确性条件
无损分解(Lossless Decomposition)
分解后的关系通过自然连接可恢复原关系:
\[r = \Pi_{R_1}(r) \bowtie \Pi_{R_2}(r) \bowtie \cdots \bowtie \Pi_{R_n}(r)\]函数依赖
在关系 $R$ 中,若属性集 $X$ 能函数决定属性集 $Y$,记作 $X \to Y$:任意两个元组 $t_1,t_2$,当 $t_1[X] = t_2[X]$ 时必有 $t_1[Y] = t_2[Y]$。
属性集闭包 $X^+$
给定函数依赖集 $F$,$X^+$ 为 $X$ 可推出的全部属性。若 $X^+$ 覆盖 $R$,则 $X$ 为超键;若其真子集都无法覆盖 $R$,则 $X$ 为候选键。
无损分解判据
$R$ 分解成 $R_1, R_2$ 无损,当且仅当
\[(R_1 \cap R_2) \to R_1 \in F^+ \quad \text{或} \quad (R_1 \cap R_2) \to R_2 \in F^+\]常以属性集闭包表示:
\[(R_1 \cap R_2)^+ \supseteq R_1 \quad \text{或} \quad (R_1 \cap R_2)^+ \supseteq R_2\]依赖保持(Dependency Preservation)
函数依赖闭包 $F^+$
Armstrong 公理:
- 自反性(Reflexivity):若 $Y \subseteq X$,则 $X \to Y$。
- 增强性(Augmentation):若 $X \to Y$,则 $XZ \to YZ$。
- 传递性(Transitivity):若 $X \to Y$ 且 $Y \to Z$,则 $X \to Z$。
计算 $F^+$ 可自 $F$ 出发反复应用以上规则直至稳定(NP-Hard)。
依赖保持判据
若原模式的所有约束($F^+$)可由分解后各子关系 $R_i$ 的约束集合 $F_i$ 推导,则称分解保持依赖,即 $F^+ = (\bigcup F_i)^+$。若不保持,则验证约束需跨表连接,代价高。判定同样为 NP-Hard。
实践中常只验证单条依赖 $\alpha \to \beta$:
- 初始化 $\rho = \alpha$。
- 对每个子关系 $R_i$:
- 取 $\rho \cap R_i$,在 $F$ 下求闭包并限制在 $R_i$ 内,得 $t$。
- 更新 $\rho = \rho \cup t$。
- 若收敛后 $\beta \subseteq \rho$,则该依赖在分解中被保持。
范式分解
- 1NF:所有属性值为原子。
- 2NF:在 1NF 基础上,非主属性完全依赖主键。
- 3NF:在 2NF 基础上,无传递依赖。
- BCNF:对 $F^+$ 中每个非平凡依赖 $X \to Y$,左部 $X$ 必为超键。
BCNF
BCNF 消除冗余最彻底,但可能不保持依赖,因此常退而求 3NF。
分解算法:
- 检查 $R$ 是否满足 BCNF;若是则结束。
- 若存在违反 BCNF 的依赖 $X \to Y$,分解为
- $R_1 = X \cup Y$
- $R_2 = R - (Y - X)$
- 对 $R_1, R_2$ 递归执行上述过程。
检测:对每条 $X \to Y \in F$,求 $X^+$;若 $X^+$ 不覆盖 $R$ 则不满足 BCNF。
3NF
3NF 在保持依赖与无损分解之间取得折衷。
分解步骤:
- 求函数依赖集 $F$ 的规范覆盖 $F_c$。
- 初始化分解结果 $\rho = \varnothing$。
- 对 $F_c$ 中每个依赖 $\alpha \to \beta$,建立关系模式 $R’ = \alpha \cup \beta$,若未被包含则加入 $\rho$。
- 若 $\rho$ 中无候选键,额外加入任意候选键对应的关系。
步骤 3 保证依赖保持,步骤 4 确保无损。
检测:需计算 $F^+$,同样是 NP-Hard。
规范覆盖(Canonical Cover)
给定依赖集 $F$,若 $F_c$ 满足:
- $F_c^+ = F^+$;
- 无冗余依赖;
- 每条依赖右部仅含单个属性;
- 无冗余属性;
- 左部唯一;
则 $F_c$ 为规范覆盖。
冗余属性 $A$:
- 若 $A \in \alpha$ 且 $(F - {\alpha \to \beta}) \cup {(\alpha - A) \to \beta}$ 仍可推出 $F$,则 $A$ 在左部冗余。
- 若 $A \in \beta$ 且 $(F - {\alpha \to \beta}) \cup {\alpha \to (\beta - A)}$ 仍可推出 $F$,则右部冗余。
算法:
- 合并相同左部:$\alpha \to \beta$ 与 $\alpha \to \gamma$ 合并为 $\alpha \to \beta\gamma$。
- 删除冗余属性,直至 $F$ 不再变化。
分解保持快速检查
只需验证关心的依赖 $\alpha \to \beta$ 是否在分解中成立:
- 置 $\rho = \alpha$。
- 遍历每个关系 $R_i$,计算 $((\rho \cap R_i)^+) \cap R_i$,并并入 $\rho$。
- 若最终 $\beta \subseteq \rho$,则该依赖被保持。
多值依赖
- 4NF