如何从数据服务中抽象数据库存储库?

时间:2017-04-23 19:24:33

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

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

1 个答案:

答案 0 :(得分:0)

在真正回答你的问题之前,我不得不问:你为什么要那样做?三思而后行,因为抽象是有代价的,只是为了有一个"清洁"设计绝对不值得。

现在回答你的问题:

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

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

  3. 当然,您可以自己动手:使用您需要的操作创建一个界面,并为您要使用的不同数据存储提供实现。此外,包括提供元数据的独立于存储的方式。

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

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

    2. 你的商店散失了很多力量。例如,RDBMSes非常适合加入东西。但是对于许多No-SQL数据库而言,加入基本上是不行的。所以你的API可能不应该提供这个功能。这基本上把所有东西都愚蠢到了共同点,当你拥有非常不同的数据存储时,它将会非常小。

    3. 这不值得。这导致了我的开场问题:为什么你还想要这样做呢?我当然看到使用切换不同的RDBMS。有些公司只希望在他们的数据中心使用某些供应商,因此有一个内存变量用于测试等等。但是将商店从例如Oracle转换为Hazelcast,然后转换为MongoDB转换为CSV?你为什么想这么做?这是什么商业价值?