【问题标题】:How can I abstract database repository from data service?如何从数据服务中抽象出数据库存储库?
【发布时间】:2017-09-20 09:27:27
【问题描述】:
【问题讨论】:
标签:
jpa
nosql
spring-data
spring-data-jpa
spring-data-mongodb
【解决方案1】:
在真正回答您的问题之前,我必须问:您为什么要这样做?三思而后行,因为抽象是有代价的,而仅仅为了获得“干净”的设计而这样做是绝对不值得的。
现在回答你的问题:
没有开箱即用的库或框架。
可能最接近它的是你显然知道的弹簧数据。如果您坚持持久存储独立接口,您的存储库将至少在某种程度上抽象持久存储的使用。但是:您必须提供不同类型的元数据(通常作为实体上的注释)才能使其正常工作。所以从这个意义上说,这是一个非常有漏洞的抽象。
当然,您可以自行开发:创建一个包含所需操作的接口,并为您要使用的不同数据存储提供实现。此外,包括提供元数据的独立于存储的方式。
所以问题变成了:为什么还没有人这样做呢?为什么你可能也不应该这样做?
很难:仅以所有(相关)SQL 数据库都能理解的方式编写 SQL 是很困难的,see this for an example。
您失去了很多商店的权力。例如,RDBMS 非常擅长连接东西。但是对于许多 No-SQL 数据库来说,加入基本上是不行的。所以你的 API 可能不应该提供这个特性。这基本上将所有内容都简化为公分母,当您拥有非常不同的数据存储时,公分母会非常小。
不值得。这又回到了我的开场白:你为什么要这样做?我当然看到了切换不同 RDBMS 的用途。一些公司只希望他们的数据中心中的某些供应商,最好有一个用于测试的内存变体等等。但是将商店从 Oracle 切换到 Hazelcast,然后从 MongoDB 切换到 CSV?你为什么想这么做?这有什么商业价值?