【问题标题】:How to abstract the database access layer?如何抽象数据库访问层?
【发布时间】:2021-05-07 18:50:46
【问题描述】:

所以我是软件开发的初学者,每次我必须编写一些从数据库中获取数据的程序时,我在构建该层时遇到问题,我想知道我是否想多了。

我知道我们应该让我们的系统易于更改,而且我认为数据库供应商是可能会改变的事情之一。 SQL 数据库通常保持不变,或者该语言已经提供了某种形式的抽象,例如 JDBC。

但是如果新的数据源是另一种类型的数据库会发生什么,我应该提供单个 DataSource 抽象吗?我还想,要做到这一点,我需要某种对象来解析数据,类似于 Java 中的 ResultSet,或者甚至像 String Map 这样简单的东西,并解析为我在其他地方需要的类型。但我也认为这样做可能会降低复杂性,将一种数据结构的数据传递给另一种更通用的数据结构。

我没有使用过 ORM,所以我不知道它们是否提供了我正在考虑的抽象,它们是否有助于解决这个问题?

那么这通常是如何处理的呢?还是不需要不同类型数据库之间的抽象?

【问题讨论】:

    标签: architecture software-design


    【解决方案1】:

    您熟悉存储库模式吗?见https://martinfowler.com/eaaCatalog/repository.htmlhttps://www.baeldung.com/java-dao-vs-repository

    我会在心理上区分数据源(例如文件、数据库、API 等)和数据集(例如一堆特定记录,例如订单)。

    举个例子 - 假设我有一个非常简单的电子商务系统,其中有两个不同的数据源:存储用户配置文件的 NoSQL DB(比如 Mongo)和存储订单信息的关系 SQL DB(比如 Postgres) .鉴于您提到了 ORM,我正在使用 Java 或 C# 等 OO 范例来解决这个问题。因此,我创建了两个域类 - UserProfileOrder。此外,我创建了两个存储库接口 - UserProfileRepositoryOrderRepository。对订单或用户配置文件进行操作的所有代码都将通过存储库执行 - 例如persistOrder()getOrders() 等。

    然后我创建两个接口实现 - MongoUserProfileRepositoryPostgresOrderRepository。使用这些存储库的所有代码仅依赖于抽象(接口)。我的MongoUserProfileRepository 使用 Mongo 数据源,并且知道如何从 Mongo 读取结果并将结果映射到我的其余代码可以使用的对象。这同样适用于我的 PostgresOrderRepository - 它只是使用 Postgres 数据源。

    如果我也想将我的用户配置文件移动到 Postgres,我只需创建一个 PostgresUserProfileRepository 并将其传递给依赖于 UserProfileRepository 接口的所有代码。所有这些变化都集中在一个地方——只在我的存储库层中。只要数据模型看起来仍然相同,其他任何东西都不会受到更改的影响。

    回答您的另一个问题 - 是的,从一个数据结构(SQL 表)映射到另一个(对象)会产生一些开销,但我从未将其视为主要问题(请参阅 https://www.techopedia.com/definition/32462/impedance-mismatch) .

    【讨论】:

      猜你喜欢
      • 2011-02-19
      • 2012-12-01
      • 1970-01-01
      • 2013-12-05
      • 2011-04-11
      • 1970-01-01
      • 2012-11-22
      • 2015-05-15
      • 1970-01-01
      相关资源
      最近更新 更多