我有一个名为School的聚合根实体。School实体包含各种聚合实体,如员工、课程、日程流、文档等,从而产生20多个属性。这些属性中的大多数都表现出一对多(1-M)关系,有些甚至有自己的聚合根。
我的问题与添加、修改或删除聚合的过程有关。目前,我加载整个聚合树,执行必要的修改,然后保存更改。但是,考虑到所涉及的大量数据,我担心此操作的潜在开销。
直接使用数据库表各自的存储库在数据库表中执行修改是否更谨慎?例如,我可以使用课程存储库根据课程ID更新课程,而不是加载整个学校来更新课程。
我感兴趣的是了解第一种方法的性能影响以及相关的利弊。
当我们有大量数据时,我们应该采取什么步骤来避免未来的任何性能问题。
3条答案
按热度按时间flseospp1#
拥有一个大的聚合可能是一个糟糕的聚合设计的标志。聚合是有意义的。它定义了对几个实体的操作的一致性边界,这些实体必须是一致的(集合体中的所有元素都是一致的)。如果它变大了,(以一种极端的方式,一个聚合为您的整个系统!),这意味着你试图保持所有实体之间的一致性。当然,你是在保持整体的一致性,但以加载整个系统数据为代价。要定义实体周围的最佳边界:
一些其他注意事项要记住:
1.域模型完整性
1.域名模型纯度
1.业绩
这里有一个优秀的**article**由弗拉德米尔Khorikov的关于这些概念。
2wnc66cl2#
学校实体包含各种聚合实体,如员工、课程、日程流、文档等,从而产生20多个属性。这些属性中的大多数呈现一对多(1-M)关系,有些甚至具有自己的聚合根。
好吧,这是你的问题。聚合根(AR)代表一致性边界,为了使边界清晰,建议只通过ID引用其他AR。在研究Spring Data JDBC之前,我认为你应该回顾一下如何design proper aggregates由行为和业务不变式驱动。
聚合设计并不是对所有实体关系进行建模,而是将评估业务不变式(必须始终保持高度一致和有效的规则)以及结果状态转换所需的数据聚集在一起。
有时,当使所有规则都强一致是不切实际的(例如,性能差,并发冲突太多等),那么我们可能需要找到一种方法来使一些规则最终一致,并分解更大的集群。
nnsrf1az3#
如果你希望你的
School
模型总是有效的,因为每个Course
都有老师,老师是分配给它的学校Staff
的一部分,那么基本上总是需要加载你的所有模型来检查这些不变量。但这种情况很少发生,更好的解决方案是允许这样的问题显式地存在于模型中(可能作为他们自己的实体)。这样用户就可以评估不同的选项并修复它们。(您可能正在使用的IDE在告诉您另一个文件中的编译错误时会执行类似的工作,但不会阻止你继续编辑当前打开的文件。MS Word也是如此,它会让你知道在当前光标位置上方3行的单词中有一个错字,但你仍然可以继续键入。