UML类图Person与Reward关联及基数约束设计问询
解决方案:基于UML的奖励与人员关联设计
方案一:使用关联类实现
- 新增关联类
PersonRewardYear,核心属性为year,用来关联Person和Reward - 配置关联基数与约束:
Person↔PersonRewardYear:基数设为0..1(按year维度,每人每年最多关联1条记录)PersonRewardYear↔Reward:基数设为1..1(每条关联记录对应唯一奖励)- 针对奖励类型的约束:
- 当
Reward.type = single时,同一year下,关联该奖励的PersonRewardYear记录只能有1条,可在UML中用约束标注:{ for all r: Reward | r.type = single → count(pr: PersonRewardYear | pr.reward = r ∧ pr.year = y) ≤ 1 ∀ y: Year } - 当
Reward.type = team时,同一year下,关联该奖励的PersonRewardYear记录无数量上限
- 当
方案二:特化Reward类实现
- 将
Reward抽象为父类,移除type属性,特化出两个子类:SingleReward:代表单人型奖励TeamReward:代表团队型奖励
- 分别设计关联关系:
Person与SingleReward通过关联类SingleRewardAssignment(含year属性)关联:Person→SingleRewardAssignment:0..1/year(每人每年最多获得1个单人奖)SingleReward→SingleRewardAssignment:0..1/year(每个单人奖每年仅能授予1人)
Person与TeamReward通过关联类TeamRewardAssignment(含year属性)关联:Person→TeamRewardAssignment:0..1/year(每人每年最多获得1个团队奖)TeamReward→TeamRewardAssignment:0..*/year(每个团队奖每年可授予多人)
实践建议
- 关联类方案适合奖励类型后续可能新增的场景,但需在业务逻辑或数据库层面额外校验单人奖的年度唯一性
- 特化方案更贴合UML单一职责原则,约束逻辑更直观,后续扩展不同奖励规则的成本更低
内容的提问来源于stack exchange,提问作者dok
相关产品推荐
相关产品推荐

