DDD:如何保存聚合的顺序?

我有两个聚合 “笔记本 “和 “笔记”。

当我使用角色 “aggregates reference only by there ids “时,我想我有两个选项。

Notebook(List<NoteId>, [other properties])
Note([other properties])

或者

Notebook([other properties])
Note(NotebookId, [other properties])

对于第一个选项,我需要两次DB调用来显示一个笔记本的所有笔记(一次是获取列表,第二次是加载笔记)。

所以我目前最喜欢的是第二种方案。现在我脑海中保存笔记顺序的方案不多,其中谁都有一些弊端。

有什么好的方法可以解决我的问题?还是第一种方案比较好,两次DB调用可以忽略不计?

谁能帮帮我?

大THX

解决方案:

看起来Note的顺序很重要,至少和Notebook有关,所以也许它应该是领域的一部分。如果是,我建议把它和Note一起存储。或者使用Note的一些其他信息在加载列表时给出一个顺序。

如果不是,为什么顺序是相关的?我的意思是,这两个实体有一个相关但分离的生命周期,或者至少看起来是这样的:一个集合–Notebook–有一个只引用另一个–Note的列表。因此,没有直接的交互计划。但是,考虑到域被正确建模(没有足够的信息来说明它),在某个地方你需要一个有序的Note列表。唯一的方法就是存储信息(或者使用已经存储的信息),否则假设(顺序是相关的)不再有效。


更新关于笔记数量和它们的大小的信息之后。

看起来你的域是这样组织的。

  • 一个根实体,即Notebook,每个Note的顺序,只有它的ID,也存储在这里:顺序的任何变化将从这里更新,而不是从Note上更新。
  • 另一个根实体–Note,有自己的生命周期和自己的 “操作”(触发实体变化的操作)。

每当你加载Notebook时,你必须同时加载Note和它的顺序,以显示它的正确顺序。另一方面,当你改变顺序时,这种结构允许你对Notebook有一个单一的操作(或操作),例如 更改订单(NoteId),更新给定Note的顺序,如果需要,还可以改变所有其他Note的顺序。这里的诀窍是,当你坚持使用Notebook时,你只需要使用Note的ID,所以你不需要加载所有的实体,而只需要加载其中的一部分,更新并再次保存。所以,Note实体有多大并不重要,因为你并没有全部使用它。因此,在每一次改变时,你可以触发该Notebook的所有情侣(NoteID,顺序)的更新。你不能做不同的事情。但是,为了支持这一点,你需要在存储库中设置一个函数,在这个函数中,你可以加载Note的ID和它的顺序,然后你再保存它;这应该不是很贵。

另一方面,所有直接在Note上操作的动作都应该加载它,因此你必须加载所有。但在这种情况下是需要加载所有,并保存所有,因为你正在改变Note本身。

总之,你持久化顺序的方式完全是需求持久化层,是建立在域之上的。我的意思是,域有一个Notebook和一组Notes,顺序是1,2,3等等。

即使我不认为这需要一个复杂的解决方案,你也可以用一种完全不同的方式来存储顺序:你可以使用100级的步骤(所以100,200,300等):每个新的Note被放在旧的两个Note的中间,并且每次都是唯一一个被保存的。每隔一段时间,你就会运行一个作业,或者其他的东西,将所有的值进行归一化,恢复100步(或者任何你用来维持顺序的东西)。正如我所说的,这看起来是一个过于复杂的问题解决方案,但它也表明了一个事实,即域的实体可能与Persitence的实体完全不同。

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何做一个自适应的图片滑块?

2022-9-8 20:32:39

未分类

如何在SQL的分组过程中获取项目的非空值?

2022-9-8 20:32:41

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索