数据库设计 · ER图转换 · 一对一联系

ER 图一对一联系转换时外键放哪边?

一对一联系看起来简单,但做关系模式转换时反而容易犹豫:外键放 A 表,还是放 B 表?要不要合并成一张表?考试一般不会考得特别刁钻,重点是看业务约束、参与情况和访问习惯。

数据库专题 软考题库编辑部 持续更新

先说结论:一对一通常有几种合理处理方式

一对一联系转换时,可以在任意一方加入另一方主键作为外键,也可以根据业务约束选择更自然的一方。如果两个实体总是同时出现、属性也不多,有些场景还可以合并成一张表。

但考试题不会只看“任意一方”这几个字。它常常会在题干里暗示:哪一方是可选参与,哪一方访问更频繁,哪一方更适合保存对方的引用。

处理方式适合场景提醒
在 A 表放 B 的主键A 端更适合保存引用,或 A 端总参与联系外键要能表达一对一约束
在 B 表放 A 的主键B 端更适合保存引用,或 B 端总参与联系不要凭表名随意放
合并成一张表两个实体生命周期高度一致合并后字段不要失去业务语义
单独建联系表联系本身有重要属性,或约束较复杂一对一不一定必须单独建表

怎么判断外键放哪边

老师讲这类题时,通常会让你先看“谁离不开谁”。如果 A 必须对应 B,而 B 不一定对应 A,把外键放在 A 表里往往更自然。这样可以减少空值,也更符合业务含义。

再看访问习惯。如果系统经常从某一方查另一方,那么把外键放在查询起点一侧,有时会让模型更直接。当然考试选择题一般不会让你深入优化性能,主要还是考关系约束是否表达正确。

小例子

一个员工最多有一个工位,一个工位最多分配给一个员工。

如果每个在职员工必须有工位,而工位可能暂时空闲,可以在员工表中保存工位编号。

如果工位管理更独立,也可以在工位表中保存员工编号,但要处理空闲工位。

和一对多、多对多的区别

一对多最常见的口诀是:外键放多端。多对多通常要单独建联系表。一对一没有这么单一的固定答案,所以更要看题干场景。

如果你在一对一题里机械套“外键放多端”,就会发现没有多端可放。这个时候回到业务约束,比背口诀更可靠。

常见错法

第一,看到一对一就默认合并表。合并不是错,但不是所有一对一都适合合并。第二,外键随便放,没有考虑是否会产生大量空值。第三,忘记一对一约束,导致外键虽然有了,却变成了一对多。

复习时建议把一对一、一对多、多对多放到一张表里比较。数据库设计题考的不是背名词,而是看你能不能把业务关系落到表结构。

相关题目解析

下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。