我对DDD很陌生,但我喜欢设计如何在代码中强制执行结构(只要你遵守原则)。我有一个难题,我相信为了解决这个问题,我需要牺牲设计,我不想这样做。但首先,我想要指出,由于我的无知,我可能从一开始就设计错误。
我有一个应用程序,其中包含一个实体,其中包含数据库术语中的BLOB。我们称这个实体为child
。因此,child
的大小很大,因为它含有一个BLOB。现在,child
可以从其AR的身份中找到,我们称之为AR parent
。还有另一个级别更高,(grandparent
),但不需要这个级别,因为child
包含传递给用户的所需数据,并且可以从用户的请求中找到parent
(应用程序需要进行一些复杂的搜索)虽然检索父母。
现在,parent
包含许多child
(一对多关系),但我每次交易只需要一个child
,因此根据请求查询parent
和child
的整个结果绝对不需要。为每个事务执行此查询也会非常低效,因为我要求DB中的大量其他数据,我甚至不会在每个事务中使用这些数据。例如,在本地保留parent
并执行单个child
的查询将会成倍地提高效率。
我也有一个紧张的SLA,所以检索child
需要非常快。我目前的蛮力方法是查询parent
,只检索child
中的一个,并将结果提供给用户。我正在寻找一种方法,我可以在本地使用parent
,没有child
列表,然后当请求到来时我查询单个child
。这将是非常快速和有效的,因为我只是检索我需要的东西。但是,这会破坏DDD的规则,因为child
在技术上仅由parent
的身份引用,并且不会是它自己的AR。
我会做这些步骤:
ParentRepository
以使用它的子项加载父项,而不使用BLOB
列。例如@Query("select c.id, c.name from Child c where c.parentId = ?1")
BLOB
列,只要需要。注意:取决于您可能希望使用缓存进行延迟加载的情况。例如番石榴图书馆。