DDD | JPA - 可能涉及牺牲设计效率的设计问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DDD | JPA - 可能涉及牺牲设计效率的设计问题相关的知识,希望对你有一定的参考价值。

我对DDD很陌生,但我喜欢设计如何在代码中强制执行结构(只要你遵守原则)。我有一个难题,我相信为了解决这个问题,我需要牺牲设计,我不想这样做。但首先,我想要指出,由于我的无知,我可能从一开始就设计错误。

我有一个应用程序,其中包含一个实体,其中包含数据库术语中的BLOB。我们称这个实体为child。因此,child的大小很大,因为它含有一个BLOB。现在,child可以从其AR的身份中找到,我们称之为AR parent。还有另一个级别更高,(grandparent),但不需要这个级别,因为child包含传递给用户的所需数据,并且可以从用户的请求中找到parent(应用程序需要进行一些复杂的搜索)虽然检索父母。

现在,parent包含许多child(一对多关系),但我每次交易只需要一个child,因此根据请求查询parentchild的整个结果绝对不需要。为每个事务执行此查询也会非常低效,因为我要求DB中的大量其他数据,我甚至不会在每个事务中使用这些数据。例如,在本地保留parent并执行单个child的查询将会成倍地提高效率。

我也有一个紧张的SLA,所以检索child需要非常快。我目前的蛮力方法是查询parent,只检索child中的一个,并将结果提供给用户。我正在寻找一种方法,我可以在本地使用parent,没有child列表,然后当请求到来时我查询单个child。这将是非常快速和有效的,因为我只是检索我需要的东西。但是,这会破坏DDD的规则,因为child在技术上仅由parent的身份引用,并且不会是它自己的AR。

答案

我会做这些步骤:

  1. 修改ParentRepository以使用它的子项加载父项,而不使用BLOB列。例如@Query("select c.id, c.name from Child c where c.parentId = ?1")
  2. 懒惰加载BLOB列,只要需要。

注意:取决于您可能希望使用缓存进行延迟加载的情况。例如番石榴图书馆。

以上是关于DDD | JPA - 可能涉及牺牲设计效率的设计问题的主要内容,如果未能解决你的问题,请参考以下文章

DDD领域驱动设计落地实践系列:战略设计和战术设计

领域驱动实战-支付系统

DDD 领域驱动设计落地实践系列:工程结构分层设计

DDD 领域驱动设计落地实践:六步拆解 DDD

什么是领域驱动设计 (DDD)? [关闭]

DDD 领域驱动设计落地实践:六步拆解 DDD