持久化几乎是软件的必备能力。所以,面向数据的设计,成为很自然的选择。
试想作为开发人员,你了解需求后,开发的第一件事就是设计数据库表结构,然后一顿CURD操作,软件就完成了。一切都很顺利,如果没有不断冒出新需求的话。
CURD有什么不好呢?简单直接,性能有保障,这是面向数据设计的优点。但是业务一复杂,特别是需要应付不断出现的新需求的情况下,你就会发现自己改不动了。为什么?因为关系模型下的数据结构过于简单,缺少抽象能力。而抽象是描述事物的有效方法之一。也是面向对象思想的能力之所在。
使用对象化的方式,使用各种领域对象来描述业务实体,这就是DDD。DDD是以业务实体为中心的设计,而不是以数据为中心的设计。以DDD的视角来看,持久化不过是众多的技术基础设施之一,不属于业务范畴。
当然,DDD不是没有代价的。其中之一是操作不当可能会带来性能问题。领域模型有效约束了写入业务数据一致性,但是从持久化媒介中转换到领域模型性能代价往往比较高。所以直接拿领域对象作为读模型使用的话,特别是在大数据量查询的情况下,会带来严重的性能问题。此时,就该CQRS登场了。