多重性标注是什么
多重性(Multiplicity)是 UML 关联端上的数量约束,标明该端可对应多少个实例,常见写法有 1、0..1、*、1..*、n..m。它读作「本端的每个实例对应另一端的多少个实例」,因此标注位置必须靠近它描述的那一端,读法是从一端读到另一端。多重性不只是画图约定,它是校验规则的直接来源:写成 1..* 就意味着提交前必须校验集合非空。
基本信息
| 标注位置 | 放在关联线靠近被描述一端的位置 |
|---|---|
| 常用写法 | 1、0..1、*(等价 0..*)、1..*、n..m |
| 默认取值 | 不标注时语义为 1,容易与「未约定」混淆 |
| 工程用途 | 生成校验代码、数据库外键约束与接口参数校验 |
| 配套表达 | 与组合/聚合、导航性、有序性一起描述集合语义 |
典型使用场景
- 领域模型评审:确认订单与明细、客户与合同的数量关系是否与业务一致
- 接口设计:约定请求体中集合字段的数量上下限,作为参数校验依据
- 数据库设计:把 0..1 与 1..* 映射为外键可空性与非空约束
- 测试用例设计:每个数量边界(0、1、上限)都能生成一条边界用例
- 数据迁移核对:清洗历史数据时按多重性发现孤记录与超限记录
- 反向审视业务合理性:出现 0..* 却业务上必须有主项时,说明模型有误
常用写法与含义
| 写法 | 含义 | 典型场景 |
|---|---|---|
| 1 | 恰好一个 | 订单必须属于一个客户 |
| 0..1 | 零或一个(可选) | 客户可选绑定一个推荐人 |
| 0..* 或 * | 零或多个 | 订单可含多条明细,也可能为空 |
| 1..* | 至少一个 | 订单必须有至少一条明细才能提交 |
| 2..5 | 区间约束 | 一张票可选 2 到 5 个座位 |
从模型到校验
从模型到校验
# 模型:Order 1 ---- 1..* OrderItem
# 1 接口层:提交订单时校验 items 非空且不超过业务上限
if not order.items: raise InvalidOrder('订单明细不能为空')
if len(order.items) > MAX_ITEMS: raise InvalidOrder('明细超出上限')
# 2 存储层:明细表外键非空,防止出现无主明细
# 3 对账:定期扫描无主记录,验证 1..* 在数据上确实成立
# 注意:* 表示零或多个,不要与 1..* 混用不标注多重性等于把解释权交给读者:同一条关联,有人按「至少一个」实现,有人按「可以为空」实现,接口校验与数据库约束随即出现分歧。
多重性描述的数量约束与业务规则可能叠加:例如明细数量在模型上是 1..*,业务上另有「单笔不超过 200 条」的限制,这类上限应写在业务规则里并在同一处维护。