首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >数据库客户端抽象

数据库客户端抽象
EN

Stack Overflow用户
提问于 2020-02-11 17:53:31
回答 1查看 246关注 0票数 1

我已经读过很多次,为任何数据库客户端编写抽象层是个好主意,这样您就可以在不影响代码的任何其他部分的情况下更改DB层。

在我的项目中,我大量地使用了BigQuery和Firebase --但是客户端库非常容易使用,我不确定可以添加什么作为抽象层,例如:

代码语言:javascript
运行
复制
  await bigquery
    .dataset(datasetId)
    .table(tableId)
    .insert(rows);

我可以将它封装在一个函数中,其中包括一个小错误处理。

另一个选择是,我使这个新客户机更多地耦合到我的域,并公开保存特定数据集的方法,而不仅仅是一个rows对象--这似乎是有害的。

nodejs应用程序中的抽象数据库是如何实现的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-14 04:16:41

最重要的部分是使您的域不依赖于实现细节。数据库是一个实现细节。

所以,这并不是太多的包装在一个函数中给它另一个名字。重点是使您的域不依赖于此。

你怎么做到的?

通过定义一个接口(这是您的抽象),它表明“我需要存储/获取数据,不管DB是什么”。然后,将该接口的BigQuery实现注入prod…中。而且很容易在测试甚至开发模式中注入内存中的实现。

现在,在JavaScript中,没有显式接口。但抽象概念仍然存在。这只是暗示而已。接口将是您实际使用的东西(鸭子输入)。

用你的具体例子

假设你有:

代码语言:javascript
运行
复制
async function doSomething() {
  // Some other domain stuff…

  await bigquery
    .dataset(datasetId)
    .table(tableId)
    .insert(rows);
}

这不会有多大帮助:

代码语言:javascript
运行
复制
function insertInDb(rows) {
  return bigquery
    .dataset(datasetId)
    .table(tableId)
    .insert(rows);
}


async function doSomething() {
  // Some other domain stuff…

  await insertInDb(rows);
}

然而,这将有助于:

代码语言:javascript
运行
复制
function insertInDb(rows) {
  return bigquery
    .dataset(datasetId)
    .table(tableId)
    .insert(rows);
}


async function doSomething(insertInDb) {
  // Some other domain stuff…

  await insertInDb(rows);
}

这种差异是微妙的,但是实际的insertInDb函数是在运行时注入的,这就反转了依赖关系。

更进一步:数据库的知识库抽象

现在,这个概念通常被命名为Repository。

如果您花了一些时间更好地表达域概念,您可能有最终的代码,如下所示:

代码语言:javascript
运行
复制
class ScoreRepositoryBigQuery {
  save(newScore) {
    // Some logic to convert `newScore` into BigQuery compatible `rows`…

    return this.bigquery
      .dataset(this.datasetId)
      .table(this.tableId)
      .insert(rows);
  }
}


async function answerQuestion(scoreRepository) {
  // Some other domain stuff…

  await scoreRepository.save(newScore);
}

使用不同的存储机制(例如,ScoreRepository、第三方服务、内存中实现等)创建一个新的MongoDB很容易。

您只需要实现隐式接口(例如,它应该有一个接受并存储save()的异步newScore方法)。

不需要触及代码的其余部分,因为它不关心实际的实现。

因此,这将是一个有用的抽象层。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60174785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档