仓储里面的缓存多对多关系怎么设计

11-04-18 txbhcml
我在仿照领域驱动设计重构了系统,当我在添加缓存功能的时候发现有点难度,希望老师指点.

我举一个例子:用户--角色 多对多关系

用户和角色都属于聚合根,因此应该都同时对应的repository,同样具有对应的缓存集合.

当从数据库中加载用户和角色的时候,该怎么维护其中间关联信息呢?

我想了两种方案,感觉都不行,

第一种:互相存放id

User

{

String[] roleIds;

}

Role

{

String[] userIds;

}

这样我在获取user后需要展示其角色列表,根据其id数组就可以直接通过id去获取角色列表,同样对角色也是.

但是现在有个问题,就是我在user里面删除角色的时候,角色缓存却没有通知到,这样就会出现脏数据.如果这时候通知一下角色的话,用户其他关联信息可能很多,是否其他的都要通知一遍?

于是我想到另一种:

就是只在用户里面存放roleIds,需要展示角色中的用户列表时,就通过反向查询user表,

这样当我删除关联信息的话都通过user来处理,但是这样效率很低.感觉还是不行

经验不多,碰到这样问题很头疼,是否建模出了问题,还是其他问题,希望指点.

2
banq
2011-04-19 09:32
这个功夫需要依靠仓储和工厂一起完成,创建对象时,确保内存中该对象是唯一,也就是缓存中的角色对象和用户中的角色对象都是指向同一个,如果更新,只更新这个唯一的角色内部状态。

jivejdon中主要模型对象都是这么做的,每个实例确保一个,这实际上是一种In-memory 模型。

SpeedVan
2011-04-19 09:33
第一,请根据业务认真分析,确定用户和角色是否都是聚合根。

第二,不要因有所谓的“关系”就内聚,内聚是表现“没你我亡”。

第三,内聚是单向的,否则不叫内聚,叫网联。

第四,保存id是数据思维,请理解清楚内聚的关系表达,保存id是平铺表达。

第五,请再次阅读DDD的相关书籍和帖子,掌握其思考过程,理解他的思想。知识缺漏,只会产生误解。

raoliv
2011-07-01 10:07
2011年04月19日 09:33 "@SpeedVan"的内容
第一,请根据业务认真分析,确定用户和角色是否都是聚合根。

第二,不要因有所谓的“关系”就内聚,内聚是表现“没你我亡”。

第三,内聚是单向的,否则不叫内聚,叫网联。

第四,保存id是数据思维,请理解清楚内聚的关系表达,保存i ...

看这哥们的头像就让我感觉你对DDD的认识不深,不过发的贴子挺多的,学习意识挺强。

猜你喜欢