Domain driven design 从多个数据库填充聚合根

Domain driven design 从多个数据库填充聚合根,domain-driven-design,aggregateroot,Domain Driven Design,Aggregateroot,我是DDD的初学者,希望了解尝试从多个数据库中填充单个聚合根是否是一种不好的做法 我试图设计一个系统,其中聚合根的所有属性都是从一个数据库填充的,除了名称。名称恰好位于不同的数据库中,需要填充到聚合根目录中才能使用 TIA简短回答:是的,这是一种糟糕的做法(甚至不是一种做法) 如表所示: DDD聚合是可以作为单个单元处理的域对象集群 此语句的后果之一是需要以事务方式存储聚合。聚合代码将确保其在内存中的状态一致性,但如果无法在数据库中强制实现该一致性,则会出现问题 将聚合存储在多个数据库中意味着要

我是DDD的初学者,希望了解尝试从多个数据库中填充单个聚合根是否是一种不好的做法

我试图设计一个系统,其中聚合根的所有属性都是从一个数据库填充的,除了
名称
名称
恰好位于不同的数据库中,需要填充到聚合根目录中才能使用


TIA

简短回答:是的,这是一种糟糕的做法(甚至不是一种做法)

如表所示:

DDD聚合是可以作为单个单元处理的域对象集群

此语句的后果之一是需要以事务方式存储聚合。聚合代码将确保其在内存中的状态一致性,但如果无法在数据库中强制实现该一致性,则会出现问题

将聚合存储在多个数据库中意味着要么不能以事务方式存储它们(不应该这样做),要么必须使用分布式事务(理想情况下也不应该这样做)

关于您的具体问题,要么您的聚合错误,要么您的数据库设计错误

查看你的聚合是否错误,考虑为什么你需要那个代码<代码>名称<代码>属性?只有当它需要与聚合的其余部分进行事务性更改,或者聚合需要它执行其业务逻辑时,它才应该存在


如果聚合正确,则将
Name
属性移动到与聚合其余部分相同的数据库(很可能是相同的表)。如果出于某种原因,您需要另一个数据库中的
名称
,以便可用于某些查询,请保持其最终的一致性(当名称在聚合中更改时,发布并订阅该名称以更新查询数据库)。

简短回答:是的,这是一种不好的做法(甚至不是一种做法)

如表所示:

DDD聚合是可以作为单个单元处理的域对象集群

此语句的后果之一是需要以事务方式存储聚合。聚合代码将确保其在内存中的状态一致性,但如果无法在数据库中强制实现该一致性,则会出现问题

将聚合存储在多个数据库中意味着要么不能以事务方式存储它们(不应该这样做),要么必须使用分布式事务(理想情况下也不应该这样做)

关于您的具体问题,要么您的聚合错误,要么您的数据库设计错误

查看你的聚合是否错误,考虑为什么你需要那个代码<代码>名称<代码>属性?只有当它需要与聚合的其余部分进行事务性更改,或者聚合需要它执行其业务逻辑时,它才应该存在

如果聚合正确,则将
Name
属性移动到与聚合其余部分相同的数据库(很可能是相同的表)。如果出于某种原因,您需要另一个数据库中的
名称
,以便可用于某些查询,请保持其最终一致性(当聚合中的名称更改时,发布事件并订阅以更新查询数据库)

我是DDD的初学者,希望了解尝试从多个数据库填充单个聚合根目录是否是一种不好的做法

对。快乐之路并不昂贵

阅读不一定是个问题;如果您所做的只是生成一个报告,那么从多个源中提取数据就可以了(尽管我们当然认识到这些源之间可能不“一致”)

<> p>但是尝试用两个数据库管理写,当事情开始出错时,很难保证数据的完整性——在更新的中间崩溃不会使数据处于健康状态。 好消息是?如果数据已经分布在两个数据库中,那么很可能要建模的是两个聚合,而不是一个。采用“客户”之类的概念并在多个聚合中共享它是完全正常的

一旦聚合边界正确,就可以以任何有意义的方式在数据库中排列聚合;模型中的每次修改都会为每个事务更新一个数据库,并维护业务不变量

毛罗·塞文蒂的演讲可能是一个有用的起点

我是DDD的初学者,希望了解尝试从多个数据库填充单个聚合根目录是否是一种不好的做法

是的,快乐之路并不昂贵

读取不一定是一个问题;如果您所做的只是生成一个报告,那么从多个源中提取数据就可以了(尽管我们当然认识到这些源之间可能不“一致”)

<> p>但是尝试用两个数据库管理写,当事情开始出错时,很难保证数据的完整性——在更新的中间崩溃不会使数据处于健康状态。 好消息是?如果数据已经分布在两个数据库中,那么很可能要建模的是两个聚合,而不是一个。采用“客户”之类的概念并在多个聚合中共享它是完全正常的

一旦聚合边界正确,就可以以任何有意义的方式在数据库中排列聚合;模型中的每次修改都会为每个事务更新一个数据库,并维护业务不变量

毛罗·塞文蒂的演讲可能是一个有用的起点