如何避免 DDD 聚合关系的 N+1 问题?
How to avoid N+1 problem with DDD aggregate relations?
我读过 Vaughn Vernon 的一篇文章,他在文中指出聚合应该只通过身份相互引用。
假设我有聚合 A,它引用了聚合 B 的标识。我想在我的 UI.[=10 中显示一个包含聚合 A 和聚合 B 中某些列的列表=]
这意味着我必须先查询聚合 A,然后我必须使用聚合 A 的引用查询聚合 B。
这似乎是一个 N+1 问题,我如何在尊重“按身份引用”规则的情况下解决这个问题?
您不应查询域对象,因为它们通常不适合查询。该域更关心创建和写入数据的命令/事务方面。
另一方面,查询 / 报告 更关心读取数据。为此,您可以开发一种尽可能接近您正在使用的数据层的轻量级查询机制。因此,您 return 而不是原始数据或 阅读模型 (DTO) 以及您需要的任何连接和数据聚合。
我读过 Vaughn Vernon 的一篇文章,他在文中指出聚合应该只通过身份相互引用。
假设我有聚合 A,它引用了聚合 B 的标识。我想在我的 UI.[=10 中显示一个包含聚合 A 和聚合 B 中某些列的列表=]
这意味着我必须先查询聚合 A,然后我必须使用聚合 A 的引用查询聚合 B。
这似乎是一个 N+1 问题,我如何在尊重“按身份引用”规则的情况下解决这个问题?
您不应查询域对象,因为它们通常不适合查询。该域更关心创建和写入数据的命令/事务方面。
另一方面,查询 / 报告 更关心读取数据。为此,您可以开发一种尽可能接近您正在使用的数据层的轻量级查询机制。因此,您 return 而不是原始数据或 阅读模型 (DTO) 以及您需要的任何连接和数据聚合。