【发布时间】:2018-04-12 22:36:26
【问题描述】:
我一直在从事一个小型项目,试图开发一种通用的数据存储选项,它可以让我同时使用关系数据库和文档数据库。出于测试目的,我从 MySQL 和 MongoDB 开始。我所有的逻辑和数据都存储在域对象中(由值对象组成),所以,我只需要一种优雅的方式将其“映射”到适当的数据存储。
是否有任何设计模式可以帮助我解决这个问题?
【问题讨论】:
标签: design-patterns database-design architecture
我一直在从事一个小型项目,试图开发一种通用的数据存储选项,它可以让我同时使用关系数据库和文档数据库。出于测试目的,我从 MySQL 和 MongoDB 开始。我所有的逻辑和数据都存储在域对象中(由值对象组成),所以,我只需要一种优雅的方式将其“映射”到适当的数据存储。
是否有任何设计模式可以帮助我解决这个问题?
【问题讨论】:
标签: design-patterns database-design architecture
如果您想采用领域驱动设计 (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 可能会给你一些想法。
【讨论】: