数据模型与关系理论

关系模型由 E.F. Codd 于 1970 年提出,是当今绝大多数数据库的理论基础。它用二维表表示数据,用集合运算描述查询,将「数据如何存储」与「数据如何查询」解耦。

核心概念

关系术语日常叫法说明
关系(relation)表(table)同类数据的集合
元组(tuple)行(row)一条完整记录
属性(attribute)列(column)一个字段
域(domain)数据类型与取值约束列允许的取值范围
基数(cardinality)行数关系中的元组个数
度(degree)列数关系的属性个数

关系模型要求每一行唯一(由主键保证),且列值满足原子性——这是一切约束与规范化的起点。

键与约束

  • 主键(Primary Key):唯一标识一行的列或列组合,非空且唯一。
  • 外键(Foreign Key):引用另一张表的主键,用于维护参照完整性。
  • 唯一键(Unique Key):保证列值不重复,允许一个 NULL(各实现略有差异)。
  • 非空(NOT NULL):强制列必须有值。
  • 检查约束(CHECK):限定列取值满足某个条件。
CREATE TABLE users (
    id         BIGINT       PRIMARY KEY,
    email      VARCHAR(255) NOT NULL UNIQUE,
    age        SMALLINT     CHECK (age >= 0),
    created_at TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE orders (
    id      BIGINT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    amount  DECIMAL(12, 2) NOT NULL,
    CONSTRAINT fk_orders_user
        FOREIGN KEY (user_id) REFERENCES users (id)
);

关系运算

关系代数提供了一组封闭的运算,SQL 是对它们的实现:

运算含义SQL 对应
选择 σ按条件筛选行WHERE
投影 π选取部分列SELECT 列表
并 ∪两个集合合并去重UNION
差 −集合相减EXCEPT / MINUS
笛卡尔积 ×全组合CROSS JOIN
连接 ⋈按条件组合行JOIN ... ON
Tip

理解「表是集合」这一心智模型非常重要:它解释了为什么 NULL 参与比较会得到 UNKNOWN 而非 TRUE,也解释了连接为何可能放大行数(笛卡尔积)。

ACID:关系型数据库的承诺

特性含义
原子性 A事务内操作要么全部成功,要么全部回滚
一致性 C事务前后数据满足所有约束
隔离性 I并发事务互不干扰
持久性 D提交后的数据不因故障丢失

关系型 vs 非关系型

维度关系型文档 / KV 型
Schema强约束、需预先定义灵活、可动态演化
扩展方式垂直扩展 + 分库分表水平分片天然友好
事务成熟、跨表强一致逐版本增强,通常单文档/单分片
查询语言标准化 SQL各产品自有的 API
适用场景结构化、强一致业务半结构化、高吞吐、弱关联数据
Warning

「NoSQL 不需要设计 Schema」是一种误解。文档模型只是把约束从数据库移到了应用层,字段命名、类型与版本仍需严格约定,否则数据会迅速腐化。

小结

  • 关系模型以表、行、列、键与约束描述数据,是一切 SQL 数据库的共同根基。
  • 主键保证实体完整性,外键保证参照完整性,二者共同维护数据的一致性。
  • SQL 是关系代数的工程化实现;理解集合语义能避免许多陷阱。