Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. 架构方案
  3. 正文
                           

【转载】系统设计 | 多对多关系模型拆解案例

2024-02-27 1972点热度 0人点赞 0条评论

系统设计 | 多对多关系模型拆解案例


一般来说,有经验的程序员不会使用多对多关系。因为存在“多对多关系”说明领域模型在设计时丢失了一些重要概念,无法建立清晰的模型。

这篇文章整理了一些多对多关系拆解的案例,作为日常领域模型设计的参考资料。

为了让图更简洁,本文使用 E-R 图作为分析模式来描述,在实际工作中可以转换为类图。

订单和商品

订单和商品是最常见的多对多关系,一个订单中可以有多个产品构成的订单行,而商品可以被多个订单使用。

如果我们认为这是一个多对多关系,在项目中会遇到不少麻烦,因为多对多关系丢失了一个订单行或者叫做订单项的概念,并且通常来说不是商品的引用,而是商品的快照。

商品的变化通常不会导致订单的变化。

系统设计 | 多对多关系模型拆解案例

群和用户

群和用户也是一个常见的例子,很容易丢失群成员的概念。增加群成员后,对象的生命周期管理会变得更简单。

群和用户的“关系”归属于群,这样在权限控制、API 设计上都会变得清晰、简洁。

另外,如果没有成员的概念,某些业务会无法实现。比如记录成员加入群的时间、在群中的昵称等信息。

系统设计 | 多对多关系模型拆解案例

标签和文章

在文章或者 CMS 系统中,一个标签可能关联多个文章,一篇文章可能使用多个标签。

对于这个场景可能会有两种拆解方案:

  • 拆解方案 A:将关系设计为标签项,纳入标签管理。
  • 拆解方案 B:将关系设计为文章标签,纳入文章管理。

这两种方案各有优缺点。

如果业务上希望标签也为其它资源使用,方案 A 就非常自然,甚至可以设计一个标签服务为各种资源实现标签索引能力。这种模型,有一点像搜索引擎的倒排索引。

但是方案 A 的成本非常高,如果没有对不同资源打标签的场景,可以使用方案 B,简单的归属到文章上即可,甚至可以序列化为 JSON 作为文章的一个属性存在。

系统设计 | 多对多关系模型拆解案例

学生和老师

在教务系统中,一名学生可以选择多名老师的课程,一名老师可以教授多门课,因此学生和老师的关系是多对多。

使用多对多描述学生和老师的关系是非常朴素的观念,中间往往缺了非常多模型,我们可以逐步拆解出来。

首先,在方案 A 中,学生和老师的关系被课程、班级取代。如果需要提取一个公共的课程概念,并多次开设,可以叫做班次。同理,在籍学生每年进入的班级都不同,那么学生应该进入多个班级,因此模型演化为方案 B。

系统设计 | 多对多关系模型拆解案例

用户、角色和资源

用户、角色构成了常见的 RBAC 模型,除此之外往往还需要抽象一个资源,避免将权限直接和 API 等具体资源绑定,所以它们看起来构成了多对多关系。

用户和角色的多对多关系可以拆解为用户角色,用户角色是某个用户拥有的角色。

某个角色能访问的资源可以设计为权限,类似于 ACL 访问控制列表,这样就能将所有多对多关系拆解完成。

对于权限来说,还有一种设计方案 B,可以将访问控制信息放到资源上,这样就看起来非常类似于 ABAC。

系统设计 | 多对多关系模型拆解案例

分销渠道和商品

对于一些分销系统或者供应链系统,对于不同渠道商可能需要维护自己的商品构成多对多关系,这样它的概念就和系统中全局的商品不一致了。

可以将其拆解为分销商品。类似的,订单也可能有分销商自己的属性和逻辑,可以设计一些拓展点。

系统设计 | 多对多关系模型拆解案例

组织和用户

在大型系统中,组织和用户往往具有多对多关系,但是这个关系没有这么简单。

在组织中承担行政工作关系的往往叫做员工,作为员工在某个应用系统中的身份可能和组织中的行政关系不一致,所以需要设计一个身份的概念。

这种拆解方式在 CRM 系统中比较常见。

系统设计 | 多对多关系模型拆解案例

总结

多对多关系往往是一个信号,意味着有隐藏的模型没有被提取,或者说找不到一个好的名字来描述隐藏的模型。

一般来说,添加一个隐藏模型即可拆解多对多关系。在某些时候,中间多对多关系可能被拆解出多个隐藏模型。

更为复杂的情况是,如何将拆解出来的隐藏模型找到合适的归属,这样才能在微服务划分时候,确定其明确的边界。

多对多关系往往是一把系统设计的钥匙,帮助我们找到更多隐藏的模型。

-END-


文 | 少个分号 (转载请注明出处)

公众号:DDD和微服务

本文仅供学习!所有权归属原作者。侵删!文章来源: DDD和微服务 -shaogefenhao :http://mp.weixin.qq.com/s?__biz=MzA4Mzc2MzcyMQ==&mid=2247485015&idx=1&sn=fe80f5bac55eff59522edf9b09e7a25b&chksm=9ff03131a887b827e792b13ee850053c858d7d7c419028bf6f9ff56b295fa0a870acb76cde7d&scene=21#wechat_redirect

更多文章:

  1. 系统设计 | RESTful API 使用问题和建议
  2. 系统设计 | 企业应用数据交换
  3. 系统设计 | “胖瘦” BFF:常见的两种微服务形态
  4. 系统设计 | 哪些技术标准可以帮助系统设计?
  5. 分布式事务场景、概念和方案整理(含概念图)
  6. 系统设计 | 如何表达技术架构?(规划篇)
  7. 系统设计 | 如何表达迭代技术方案?(战术篇)
  8. 系统设计 | 搭建持续集成和部署流水线
  9. 系统设计 | 基于读者反馈的补充更新 (1)
  10. 系统设计 | 设计和解析 DSL
标签: 转载 系统设计 架构方案 关系模型 多对多
最后更新:2024-02-27

coder

分享干货文章,学习先进经验。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

广告
文章目录
  • 订单和商品
  • 群和用户
  • 标签和文章
  • 学生和老师
  • 用户、角色和资源
  • 分销渠道和商品
  • 组织和用户
  • 总结
最新 热点 推荐
最新 热点 推荐
干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议 视频笔记:什么是微服务,为什么是微服务? 视频笔记:什么是AI 智能体? 视频笔记:什么是Flink? 如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具
Elasticsearch 使用误区之六——富文本内容写入前不清洗基于 MySQL Binlog 实现可配置的异构数据同步马蜂窝消息总线——面向业务的消息服务设计干货 | 论Elasticsearch数据建模的重要性你可以不用RxJava,但必须得领悟它的思想!如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具视频笔记:什么是Flink?视频笔记:什么是AI 智能体?
Java后端18种接口优化技巧 笔记 | Java对象探秘 二级缓存架构极致提升系统性能 JAVA字节码增强解密(上) 研发日常踩坑-Mysql分页数据重复 视频笔记:什么是Flink? Chrome插件(扩展)开发全攻略2.6w字,看这篇就够了! 浅析Redis大Key

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (2) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (18) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2

x