Caching 在实现有界上下文时优化数据库查询

Caching 在实现有界上下文时优化数据库查询,caching,orm,domain-driven-design,data-access-layer,bounded-contexts,Caching,Orm,Domain Driven Design,Data Access Layer,Bounded Contexts,在我们的项目中,我们试图应用这种思想,我们面临着一种明显的性能问题。例如,我们有不同的类(在不同的上下文中)来表示系统中的用户:Person在我们的核心域上下文中,以及user在安全上下文中。因此,每个聚合都有两个不同的存储库,但它们在DB中使用相同的表,有时访问相同的数据 在这种情况下,是否有减少db往返的通用解决方案?是否有处理它的ORM,或者我们应该自己编写一些缓存系统 upd:数据库来自遗留应用程序,我们必须按原样使用它。如果所有用户都是个人(有时外部服务也被建模为特殊用户),那么用户和

在我们的项目中,我们试图应用这种思想,我们面临着一种明显的性能问题。例如,我们有不同的类(在不同的上下文中)来表示系统中的用户:
Person
在我们的核心域上下文中,以及
user
在安全上下文中。因此,每个聚合都有两个不同的存储库,但它们在DB中使用相同的表,有时访问相同的数据

在这种情况下,是否有减少db往返的通用解决方案?是否有处理它的ORM,或者我们应该自己编写一些缓存系统


upd:数据库来自遗留应用程序,我们必须按原样使用它。

如果所有用户都是个人(有时外部服务也被建模为特殊用户),那么用户和个人在数据库上应该共享的唯一数据就是他们的标识符。 事实上,域模型中的每个实体都应该只保存对数据的引用,以确保它们的不变量

此外,我猜用户是通过用户名识别的,而人员是通过其他东西识别的(增值税代码等等)

因此,最简单的优化技术是避免在实体中封装那些不需要确保其不变量的信息

此外,您只需要一种有效的技术,以便在需要时轻松地从用户传递到用户。我用这个

例如,您可以在用户类中公开此人的标识符,这样对此人存储库的简单查询就可以为您提供所需的数据

最后,我向你推荐最新的

因此,对于每个聚合,我们有两个不同的存储库,但是 他们在数据库中使用同一个表,有时访问同一个表 数据

在同一个表中存储了两个聚合,这表明设计存在问题。在本例中,您似乎有两个有界上下文—核心域的BC(Person在这里)和身份/访问BC(User在这里)。BCs是相关的,后者可视为前者的上游。核心域中的
在身份BC中有一个相应的
用户
,但它们并不完全相同

除了BCs之间的这种关系之外,还有关于行为所有权的问题。例如,一个人和一个用户都可能有一个名字,要确定的是谁拥有更改名字的行为。这可以通过几种方式实现。个人可能有自己的姓名,更改应传播到身份BC。类似地,用户可能拥有对名称的更改,在这种情况下,这些更改必须通过同步机制传播给Person


总的来说,您的问题可以通过两种方式解决。首先,您可以将人员和用户聚合存储在不同的表中。任何给定的查询都应该只使用这些表中的一个,并且它们可以在最终一致的情况下进行同步。另一种方法是将行为域模型与为查询设计的模型分离()。通过这种方式,您可以创建一个为特定屏幕服务的读取模型,并有一个定制的查询,甚至可能在ORM之外。

我忘了提到db来自遗留应用程序,所以我们必须“按原样”使用它。感谢您的回复,will将查看您提供的文章。“您在同一个表中存储了两个聚合,这表明设计存在问题。”在DDD中,设计应该完全不了解数据库模式,因此很难看出数据库会对设计产生如此大的影响。“另一种方法是将行为域模型与为查询而设计的模型(读取模型)解耦。”“这是一个很好的建议,+1!若模式是原样的,那个么我仍然有单独的存储库。这样,至少您的代码将被组织起来。如果你必须从同一张表中选择两次,那就这样吧。总的来说,性能损失微不足道。