【发布时间】:2019-01-06 01:21:48
【问题描述】:
希望从已将其存储库从关系数据库迁移到 NoSQL 的任何人那里获得任何建议?
我们目前正在使用 Postgres 数据库和 ORM (SQLAlchemy) 构建应用程序。但是,以后我们可能需要将应用程序迁移到当前仅支持几个 NoSQL 解决方案的环境。
考虑到这一点,我们对 Vaughn Vernon 的实施领域驱动设计中涵盖的存储库采用了面向持久性的方法。这会产生以下 API:
save(aggregate)
save_all(aggregates)
remove(aggregate)
get_by_...
无需赘述,ORM 特定代码已隐藏在存储库本身中。 Session 仅用于检索或更新数据,然后立即提交和关闭(在 repos 方法中)的短时间内。这意味着在保存时进行大量合并,而不是最有效地使用 Session。
def save(aggregate):
try:
session.merge(aggregate)
commit
except:
rollback
def get():
try:
aggregate = session.query_by(id)
session.expunge
commit
except:
rollback
return aggregate
等等等等
优点:
- 我们将自己限制为每个用例更新单个聚合,因此在应用程序服务中充分利用 UOW 事务控制的可能性很小(除了性能之外)。在写入聚合时,会在存储库中启用事务控制,以确保保留完整的聚合。
- 在存储库之外没有 ORM 特定的代码泄漏,无论如何在切换到 NoSQL 数据库时都需要重新编码。
因此,如果我们确实必须切换到 NoSQL 数据库,我们应该做的工作量最少。
然而,我读过的几乎所有内容都鼓励事务行为存在于应用程序服务层中。尽管我认为 Business Transactional 和 DB Transactional 之间存在区别。
同样,我们正在对性能造成影响,因为我们在每次调用存储库时都要求会话工厂进行会话。大多数服务包含大约 3 次对存储库的调用。
那么,对于从关系数据库迁移到 NoSQL 数据库的任何人来说,问题是什么?
工作单元/会话的概念在 NoSQL 世界中是否有意义?
我们是否应该同时完全接受 ORM,并将 UOW/Session 从存储库移到应用程序服务中?
如果我们这样做,如果我们最终需要迁移到 NoSQL 解决方案,那么重新设计应用程序服务的工作量是多少。 (在任何情况下都需要重新编写存储库)。
最后,有人在编写与实现无关的存储库方面有丰富的经验吗?
附言。了解我们可以完全放弃 ORM,同时使用纯 SQL,但我们被要求确保我们使用的是 ORM。
【问题讨论】:
-
是的,但当前数据库是关系数据库。问题涉及以一种方式对当前应用程序进行编码,以使将来尽可能轻松地切换到非关系数据库(因为已经向我们表明,我们可能需要这样做,这超出了我们的控制范围。)。
标签: database orm nosql domain-driven-design repository-pattern