弱实体的关键:自己不够独立,需要依赖强实体
弱实体通常不能只靠自己的属性唯一标识,需要借助所属强实体的主键。比如订单明细可以有行号,但同一个行号会出现在不同订单里。单看行号 1,你不知道是哪张订单的第一行;要加上订单号,才能唯一确定一条订单明细。
这就是弱实体的核心感觉:它不是没有属性,而是自身的标识不完整。它的存在和识别都依赖另一个实体。考试里如果题干说“必须依附于”“离开某对象没有意义”“编号只在所属范围内唯一”,就要警惕弱实体。
| 判断点 | 强实体 | 弱实体 |
|---|---|---|
| 能否独立标识 | 通常可以 | 通常不可以 |
| 主键来源 | 自身属性可形成主键 | 需要加上依赖实体主键 |
| 存在依赖 | 可独立存在 | 依赖强实体存在 |
| 例子 | 订单、部门、客户 | 订单明细、家庭成员、班级内座位号 |
弱实体转关系模式:把强实体主键带进来
弱实体转换成关系模式时,通常要把依赖的强实体主键放进弱实体表中,作为外键;弱实体自己的部分键再和这个外键一起组成主键。比如订单明细表可以是:订单明细(订单号, 行号, 商品编号, 数量, 单价)。
这里订单号来自订单表,是外键;行号只在同一张订单内唯一,是部分键;订单号加行号,才能唯一确定一条订单明细。这个结构比单独用行号做主键更符合业务。
小例子:订单和订单明细
订单(订单号, 客户编号, 下单时间)。
订单明细(订单号, 行号, 商品编号, 数量, 单价)。
订单明细依赖订单存在,订单号 + 行号 才能唯一标识一条明细。
如果只用行号,很多订单都会有第 1 行,无法唯一定位。
弱实体和普通一对多别混
弱实体常常表现成一对多,但不是所有一对多的多端都是弱实体。部门和员工是一对多,但员工通常有自己的员工号,可以独立标识,所以员工不是弱实体。订单和订单明细也是一对多,但明细行通常依赖订单号和行号才能识别,因此更像弱实体。
判断弱实体,别只看数量关系,要看标识是否依赖。这个点很重要:一对多回答的是基数,弱实体回答的是识别和存在依赖。考试选项如果把这两件事混在一起,就要小心。
| 场景 | 是否一对多 | 多端是否弱实体 | 原因 |
|---|---|---|---|
| 部门-员工 | 是 | 通常不是 | 员工有独立员工号 |
| 订单-订单明细 | 是 | 通常是 | 明细行依赖订单号识别 |
| 班级-学生 | 是 | 通常不是 | 学生有学号 |
| 楼栋-房间 | 是 | 可能是 | 房间号可能只在楼栋内唯一 |
画图和答题时怎么表达
不同教材和工具对弱实体画法细节可能不同,有的用双矩形表示弱实体,有的强调识别联系和部分键。考试中更重要的是你能说清关系模式怎么落地:弱实体表要带上强实体主键,并和部分键一起形成标识。
如果题目没有明确要求画弱实体符号,关系模式里也要体现依赖关系。比如订单明细表漏掉订单号,就会导致明细无法归属;只写一个行号做主键,也无法全局唯一。
相关题目解析
下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。
- 数据库表中的主键为什么不能重复也不能为空?主键 / 实体完整性
- 外键约束为什么能维护参照完整性?外键约束 / 参照完整性
- 函数依赖中属性闭包怎么求?属性闭包 / 函数依赖