← [ BACK_TO_NOTES ]

一对多关系

一对多关系描述一个父实体可以关联多个子实体,关系数据库通常把外键放在“多”的一侧。

#concept #growing #backend #database

[!info] related notes

一对多关系

一句话定义

一对多(1:N)表示一个 A 可以关联多个 B,而每个 B 在这条关系中只指向一个 A;关系数据库通常把 A 的主键作为外键存到 B。

核心机制

User 1 ───── N Assessment
              ↑
            user_id

典型表结构:

CREATE TABLE assessments (
  id BIGINT PRIMARY KEY,
  user_id BIGINT NOT NULL REFERENCES users(id)
);

user_id 可以重复,所以它通常不能是主键或单列 UNIQUE;重复值正是“一个 User 对应多个 Assessment”的表达。

为什么外键放在“多”的一侧

如果把 assessment_id 放到 users,一个用户有第二、第三个 Assessment 时就需要额外列或数组。把 user_id 放到 assessments,每新增一个 Assessment 只需新增一行,关系可以自然扩展。

可选关系与生命周期

  • user_id NOT NULL:每个 Assessment 必须属于 User。
  • user_id 可空:允许暂时没有父实体。
  • ON DELETE RESTRICT:仍有子记录时禁止删除父记录。
  • ON DELETE CASCADE:删除父记录时级联删除子记录。
  • ON DELETE SET NULL:删除父记录后保留子记录,但外键必须允许 NULL。

删除策略不是语法偏好,而是领域生命周期语义。

边界与常见误解

  • 1:N 描述的是某一条关系,不代表两个实体之间只能存在这一种关系。
  • 外键主要负责引用完整性;JOIN 负责查询时组合数据,两者不是同一能力。
  • 应用层可以提前检查父记录是否存在,但数据库外键才是持久化层的最终不变量。
创建于 2026/9/14 更新于 2026/9/14
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本