领域驱动设计鼓励您使用丰富的领域模型。这意味着所有的领域逻辑都位于领域模型中,并且领域模型是至高无上的。持久性成为一个外部问题,因为理想的领域模型本身对持久性一无所知(例如数据库)。
我一直在一个中等规模的单人项目(> 100k 行 Java)中使用它,我发现了许多优点,主要是它提供的灵活性和可重构性,而不是面向数据库的方法。我可以添加和删除域类,点击几个按钮,一个全新的数据库模式和 SQL 层就会推出。
但是,我经常遇到这样的问题,即我发现很难将富域逻辑与支持应用程序的 SQL 数据库这一事实相协调。通常,这会导致典型的“1+N 查询问题”,即您获取 N 个对象,然后对每个再次触发查询的对象执行一个重要的方法。手动优化此过程允许您在恒定数量的 SQL 查询中执行该过程。
在我的设计中,我允许系统插入这些优化版本。我通过将代码移动到一个“查询模块”中来做到这一点,该模块包含数十个特定于域的查询(例如 getActiveUsers),其中两个都在内存中(幼稚且不可扩展)和基于 SQL(用于部署)的实现。这使我可以优化热点,但有两个主要缺点:
- 我有效地将我的一些域逻辑移动到它并不真正属于的地方,实际上甚至将其推入 SQL 语句中。
- 这个过程需要我仔细阅读查询日志以找出热点在哪里,然后我必须重构代码,通过将其降低到查询中来降低其级别抽象。
有没有更好、更简洁的方法来协调域驱动设计及其富域模型与您不能将所有实体都保存在内存中并因此仅限于数据库后端的事实?