Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design DDD中聚合子对象的检索_Domain Driven Design - Fatal编程技术网

Domain driven design DDD中聚合子对象的检索

Domain driven design DDD中聚合子对象的检索,domain-driven-design,Domain Driven Design,在DDD中,聚合的根是检索其子对象的唯一引用。聚合的根存储库只负责提供根对象引用。如果我需要子对象,那么需要调用聚合的getter方法来检索子对象,这将导致DB查询 考虑一个从DB检索多个聚合的情况。所以在我的例子中,这种情况会导致多个DB查询,这会导致非常慢的请求。如何在DDD方面避免这种情况。为了坚持下去,我遇到了一种叫做工作单元的模式。是否有任何搜索模式可以解决我的问题或其他方法来解决此问题。首先,95%的问题由ORM解决(如果您碰巧使用关系数据库) 聚合根存储库应该(在大多数情况下)返回

在DDD中,聚合的根是检索其子对象的唯一引用。聚合的根存储库只负责提供根对象引用。如果我需要子对象,那么需要调用聚合的getter方法来检索子对象,这将导致DB查询


考虑一个从DB检索多个聚合的情况。所以在我的例子中,这种情况会导致多个DB查询,这会导致非常慢的请求。如何在DDD方面避免这种情况。为了坚持下去,我遇到了一种叫做工作单元的模式。是否有任何搜索模式可以解决我的问题或其他方法来解决此问题。

首先,95%的问题由ORM解决(如果您碰巧使用关系数据库)

聚合根存储库应该(在大多数情况下)返回一个包含所有子对象(实体)的完全加载的对象。延迟加载子项应该是一个例外,而不是一个规则

另一件事是,您应该避免一次加载和持久化多个聚合。尝试重新划分域,以便每个用户交互只处理一个聚合


并考虑文档数据库解决方案。将整个聚合作为文档存储在doc数据库中确实是明智之举。

好吧,似乎您有一个场景,在单个用例中,您希望读取多个AR,并将其状态保存到DB中。读取操作需要很长时间吗?还是读写都需要时间

您的域模型和聚合根应该通过用例的交互部分地定义。我想说的是,模型的设计应该满足客户的需求。这个场景似乎不太适合您的模型

使用大型数据视图的报告或其他操作应绕过域模型。不要将DDD用于报告等。只需快速访问数据即可

第二。如果您希望所有聚合都参与事务,那么工作单元是一种方法

第三,。我会说,使用延迟加载,但是在一些需要性能提升的用例中,您可以执行加载策略,这意味着您可以让根用户加载一些子集合,而无需触发sql子选择。。。 看看这篇文章(即使它的for EF模式也适用于nhorm)


最后,您可以始终提供db索引、缓存等来提高性能,但鉴于场景信息,您采取了某种错误的设计决策。我不知道所有的事实,但可能有些用例不适合

如何将实体映射到数据库?使用NHibernate、EF等?如果是,请指定您的ORM,以便我们提供具体指导。满载实体很好。但是例如,我们有一个类User,他有很多someAction。当我们第一次得到用户时,我们只需要最后10个动作。在其他地方,我们需要上个月采取一些行动。你将如何做到这一点?那么也许某个动作本身就是一个聚合?顺便说一句,是的。我找不到更好的解决办法。