首页/开发/系统分析与架构设计速查/多重性(Multiplicity)标注
需求分析与建模61 条

多重性(Multiplicity)标注

多重性表示关联某一端可对应的实例数量范围,常见写法 1、0..1、*、1..*、n..m;标注在靠近对应类的一端,读法从一端读到另一端。

多重性标注是什么

多重性(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 条」的限制,这类上限应写在业务规则里并在同一处维护。

易错点

  • 默认不写多重性:读者按各自习惯理解,接口校验与数据库约束不一致
  • 把集合端的 * 理解为「至少一个」:与 1..* 混淆,空集合被错误放行
  • 只在图上标注不落到代码与表结构:模型与实现脱节,约束形同虚设
  • 上下限不一致:模型写 1..*,业务上限另有约定且未同步,超限数据进入系统

数据来源与参考

  • OMG UML 2.5.1 规范
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌