上QQ阅读APP看书,第一时间看更新
1.3.5 聚合是数据修改的单元
可以从这个角度考虑聚合的边界:如果两个实体之间的状态出现不一致(即使只有非常短暂的一瞬间我们能看到它们的不一致)就让人难以接受的话,那么这两个实体属于同一个聚合;否则它们就不属于一个聚合。
比如,也许我们不能接受一个订单的所有订单行项的金额之和不等于订单头的总金额。那么,我们可以把订单头与订单行项这两个实体划归到一个聚合内。
对于一个聚合内的对象状态(数据)的修改,我们需要保证它们总是一致的,也就是说我们要实现它们的强一致性。
聚合是数据修改的单元,这个观点其实已经被广泛接受,所以有人说大多数NoSQL数据库都是聚合型数据库。因为主流的NoSQL数据库,不管是文档型的MongoDB,还是KV型的Redis,它们最少都能保证一个聚合内的数据的强一致性,不管它们把这个聚合叫作文档还是叫作Value。
你可能听说过所谓“聚合内强一致,聚合外最终一致”的建议。它的意思是,对于同一个聚合内实体的数据(状态)的一致性,开发人员可以使用数据库系统提供的ACID事务来实现强一致性;对于不同聚合之间的数据,开发人员应该优先考虑自己编码来实现最终一致性。DDD社区中很多人都赞同这个实践。
强一致性模型与最终一致性模型是两种不同的数据一致性模型,这里的模型可以理解为数据库系统与开发者之间的契约(Contract)。强一致性模型是指,开发者只要按照数据库系统的某些规则来做,就可以保证数据绝对不会不一致。最终一致性模型是指,开发者按照一定的规则来做,数据库中的数据项在处理“过程中”可能会出现不一致,但是在处理过程结束后,它们最终可以达到一致。