【问题标题】:Verstile data-storage: abstracting through DDD to store in either relational or document databases?多功能数据存储:通过 DDD 进行抽象以存储在关系数据库或文档数据库中?
【发布时间】:2018-04-12 22:36:26
【问题描述】:

我一直在从事一个小型项目,试图开发一种通用的数据存储选项,它可以让我同时使用关系数据库和文档数据库。出于测试目的,我从 MySQL 和 MongoDB 开始。我所有的逻辑和数据都存储在域对象中(由值对象组成),所以,我只需要一种优雅的方式将其“映射”到适当的数据存储。

是否有任何设计模式可以帮助我解决这个问题?

【问题讨论】:

    标签: design-patterns database-design architecture


    【解决方案1】:

    如果您想采用领域驱动设计 (DDD) 方法,存储库可能正是您所寻找的。​​p>

    首先,您需要定义您的存储库合约(或接口),通常是这样的(根据您使用的任何语言进行调整):

    public IMyObjectRepository {
        MyObject get(int id);
        Collection<MyObject> getAll();
        void save(MyObject myObject); 
        void delete(int id);
    } 
    

    然后你可以有一个 MySQL 和 MongoDB 的实现。

    为了将客户端与 IMyObjectRepository 的实现及其创建方式分离,客户端可以通过 抽象工厂 模式或类似模式请求它。然后,您可以根据属性文件或某种其他类型的环境自省,将正确的实现返回给它们。

    DDD 方面可能是次要的 -- 你可以在没有 DDD 的情况下做到这一点。您主要关心的是以某种与实现无关的方式(接口)定义您的持久性合约,并有一种方法可以在不将客户端耦合到实现(抽象工厂)的情况下获取对它的引用。 Respository 是一种方式——您可以在 DAO(或两者的组合)中实现。

    Here is an example using DAOs and and Abstract Factory 可能会给你一些想法。

    【讨论】:

      猜你喜欢
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 2010-11-26
      • 1970-01-01
      • 2011-07-15
      • 2019-01-17
      • 1970-01-01
      相关资源
      最近更新 更多