【问题标题】:How can I abstract database repository from data service?如何从数据服务中抽象出数据库存储库?
【发布时间】:2017-09-20 09:27:27
【问题描述】:

我正在阅读这篇文章https://www.infoq.com/articles/spring-data-intro,以了解数据服务层如何独立于数据库(RDBMS /NoSQL)。看起来没有办法将实体和存储库设计为独立于数据库。这篇文章写于 2012 年。从那时起,我们是否还有其他技术实现了此功能?

【问题讨论】:

    标签: jpa nosql spring-data spring-data-jpa spring-data-mongodb


    【解决方案1】:

    在真正回答您的问题之前,我必须问:您为什么要这样做?三思而后行,因为抽象是有代价的,而仅仅为了获得“干净”的设计而这样做是绝对不值得的。

    现在回答你的问题:

    1. 没有开箱即用的库或框架。

    2. 可能最接近它的是你显然知道的弹簧数据。如果您坚持持久存储独立接口,您的存储库将至少在某种程度上抽象持久存储的使用。但是:您必须提供不同类型的元数据(通常作为实体上的注释)才能使其正常工作。所以从这个意义上说,这是一个非常有漏洞的抽象。

    3. 当然,您可以自行开发:创建一个包含所需操作的接口,并为您要使用的不同数据存储提供实现。此外,包括提供元数据的独立于存储的方式。

    所以问题变成了:为什么还没有人这样做呢?为什么你可能也不应该这样做?

    1. 很难:仅以所有(相关)SQL 数据库都能理解的方式编写 SQL 是很困难的,see this for an example

    2. 您失去了很多商店的权力。例如,RDBMS 非常擅长连接东西。但是对于许多 No-SQL 数据库来说,加入基本上是不行的。所以你的 API 可能不应该提供这个特性。这基本上将所有内容都简化为公分母,当您拥有非常不同的数据存储时,公分母会非常小。

    3. 不值得。这又回到了我的开场白:你为什么要这样做?我当然看到了切换不同 RDBMS 的用途。一些公司只希望他们的数据中心中的某些供应商,最好有一个用于测试的内存变体等等。但是将商店从 Oracle 切换到 Hazelcast,然后从 MongoDB 切换到 CSV?你为什么想这么做?这有什么商业价值?

    【讨论】:

    • 当我阅读有关 Tinder 软件工程的信息时,这个问题一直困扰着我。看起来他们在迁移到 mongoDB 之前使用了 RDBMS。 thenewstack.io/…quora.com/Whats-Tinders-database-structure 我开始思考如何在不修改实体的情况下完成它。好奇心,没有真正的用例。
    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2011-10-22
    相关资源
    最近更新 更多