如何设计Image聚合与使用方关联关系 实现图片全局唯一单次使用
可行设计思路
方案1:轻量改造Image聚合(改动最小,适合小型项目)
- 在
Image聚合新增3个非必填字段:owner_type:枚举类型,标识占用该图片的业务聚合类型,例如Company/Product等owner_id:字符串/数字类型,对应占用方聚合的唯一IDusage_type:枚举类型,标识图片的具体用途,例如logo/photo/banner等
- 业务逻辑层新增通用校验规则:任何业务方要关联图片时,先查询对应
filename的Image记录,若上述3个字段已有值,直接返回校验失败;若为空则将当前业务方的信息写入这3个字段后再完成关联操作 - 数据库层给
filename加唯一约束兜底,避免并发场景下的校验穿透问题
方案2:上传环节绑定归属(性能最优,适合上传入口统一的场景)
- 调整图片上传接口逻辑,要求调用方上传时必须传入所属的
owner_type、owner_id、usage_type参数 - 图片上传成功后直接将归属信息写入
Image聚合的对应字段,后续业务方关联图片时不需要再做校验,直接存filename即可 - 该方案将校验逻辑前置到上传环节,没有额外的运行时校验开销,也从根源上避免了游离图片被随意关联的问题
方案3:独立图片使用管控域(扩展性最强,适合多业务线的中大型系统)
- 单独抽取
ImageUsage限界上下文,专门维护全系统所有图片的占用关系,该域的核心实体只存filename、owner_type、owner_id、usage_type四个字段 - 所有业务方关联图片前必须先调用
ImageUsage域的占用接口,占用成功才能完成后续关联操作,规则逻辑完全收口在该域维护 - 后续如果调整图片使用规则(例如放开特定场景的复用限制、新增权限校验逻辑),只需要修改该域的逻辑即可,不需要侵入各个业务线的代码
注意事项
- 所有涉及图片占用的操作都要加事务控制,配合乐观锁/行锁避免并发冲突
- 若业务存在图片释放的场景(例如删除公司、替换logo),需要同步清空对应图片的占用标识,避免资源被锁死无法复用
内容的提问来源于stack exchange,提问作者user1094627
相关产品推荐
相关产品推荐

