一对多关系
一对多关系描述一个父实体可以关联多个子实体,关系数据库通常把外键放在“多”的一侧。
#concept
#growing
#backend
#database
[!info] related notes
- 所属 MOC: database-moc
- 前置概念: primary-key、foreign-key
- 并列概念: many-to-many-relationship
- 易混淆概念:
- 关系笔记: primary-key-foreign-key-and-constraints
一对多关系
一句话定义
一对多(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负责查询时组合数据,两者不是同一能力。 - 应用层可以提前检查父记录是否存在,但数据库外键才是持久化层的最终不变量。