Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >数据库客户端抽象

数据库客户端抽象
EN

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  await bigquery
    .dataset(datasetId)
    .table(tableId)
    .insert(rows);

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-13 20:16:41

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

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

你怎么做到的?

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

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

用你的具体例子

假设你有:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async function doSomething() {
  // Some other domain stuff…

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

这不会有多大帮助:

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


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

  await insertInDb(rows);
}

然而,这将有助于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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

复制
相关文章
PHP 数据库抽象层 PDO
统一各种数据库的访问。 支持的数据库,只列出常用的 PDO_MYSQL PDO_PGSQL PDO_SQLITE 其他请查看这里 https://pecl.php.net/package-
康怀帅
2018/02/28
9290
对于数据库--还有同学反映太抽象
那你把数据库想象为一个教学楼(数据库); 教学楼的每一间教室想象为一个数据表(表); 教室里面的学生想象为数据(具体数据); 我们对数据库中数据的---增删改查, 对应学生就是 学生的增加,开除,改名,查人; 那一个国家或者城市有很多教学楼; 那么就是说,一个mysql数据库软件里有多个数据库; 数据库的名字不一样;
前朝楚水
2018/04/03
7710
万字长文手写数据库连接池,让抽象工厂不再抽象
上图中有正方形、圆形和菱形3种图形,相同颜色、相同深浅的代表同一个产品族,相同形状的代表同一个产品等级结构。同样可以从生活中来举例,比如,美的电器生产多种家用电器,那么上图中,颜色最深的正方形就代表美的洗衣机,颜色最深的圆形代表美的空调,颜色最深的菱形代表美的热水器,颜色最深的一排都属于美的品牌,都属于美的电器这个产品族。再看最右侧的菱形,颜色最深的被指定了代表美的热水器,那么第二排颜色稍微浅一点的菱形代表海信热水器。同理,同一产品族下还有格力洗衣机、格力空调、格力热水器。
Tom弹架构
2021/11/12
6100
【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象
不完整的抽象 抽象未支持所有互补或相关的方法时,将导致这种坏味。 为什么要有完整的抽象? 一种重要的抽象实现手法是创建内聚而完整的抽象。抽象未支持相关的方法时,可能会影响抽象的内聚性和完整性。如果抽象只支持部分相关的方法,其使用者就可能不得不自己去实现其他的功能。客户程序可能尝试直接访问抽象的内部实现细节,此时带来的副作用是违反封装原则。 一些常见的互补方法对 Min/Max Open/Close Create/Destroy Get/Set Read/Write Print/Scan First/Last
撸码那些事
2018/06/21
7400
【抽象那些事】缺失抽象
这是一个笑脸,那么我们是怎么知道这是一个笑脸的呢?通过抽象。人脸数以亿计,却各不相同。我们忽略了不重要的细节,如发型和发色。我们还概括了相同的东西,每个人都有两只眼睛,微笑时嘴角上扬。这就是抽象。对于软件工程师来说,抽象能力是最重要的能力之一,也恰恰是最难得的能力之一。
撸码那些事
2018/05/19
9790
【抽象那些事】缺失抽象
【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象
一种重要的抽象实现手法是创建内聚而完整的抽象。抽象未支持相关的方法时,可能会影响抽象的内聚性和完整性。如果抽象只支持部分相关的方法,其使用者就可能不得不自己去实现其他的功能。客户程序可能尝试直接访问抽象的内部实现细节,此时带来的副作用是违反封装原则。
撸码那些事
2018/05/23
4720
【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象
【抽象那些事】缺失抽象
抽象原则倡导通过精简和概括来简化实体:精简是删除不必要的细节,而概括是找出并定义通用的的重要特征。 这是什么? 这是一个笑脸,那么我们是怎么知道这是一个笑脸的呢?通过抽象。人脸数以亿计,却各不相同。我
撸码那些事
2018/06/21
6610
抽象
抽象通过将一个事物中最本质的含义抽取出来,去掉了大量的信息。只保留下来核心信息,事物的复杂度大大降低。如果我们只看到了表面,事物包含的庞大信息将撑爆我们的记忆。
Dylan Liu
2019/07/01
9782
【Kotlin】抽象类 ( 声明 | 抽象类成员 | 抽象类继承 | 抽象方法覆盖 | 抽象方法实现 )
② 成员 : 抽象类中既可以定义正常属性和方法 , 又可以定义抽象的属性和方法 ;
韩曙亮
2023/03/27
1.2K0
抽象语法树为什么抽象
Abstract Syntax Tree抽象语法树(通常被简写成AST)实际上只是一个解析树(parse tree)的一个精简版本。在编译器设计的语境中,"AST" 和 "语法树"(syntax tree)是可以互换的。
麒思妙想
2020/08/17
1.6K0
抽象类与抽象方法
在我们抽象实例对象的时候,有这样一种情况,往上层抽象时就会发现很难描述对象的属性和行为,比如“形状” ,其方法计算面积怎么计算?正方形知道怎么计算,长方形也知道怎么计算,但是形状呢,你肯定会问什么形状,不告诉我,我怎么计算呢?好吧,形状确实是有面积的,但是又无法描述其实现方式,这种包含类我们可以抽象出一个抽象类。
sr
2018/08/20
4390
抽象类与抽象方法
【抽象那些事】 命令式抽象
这种坏味是由操作转换为类引起的,表现为类中只定义了一个方法,有时候类名和方法名相同。这种坏味还常常表现为方法操作的数据位于另一个类中。
撸码那些事
2018/05/20
8440
【抽象那些事】 命令式抽象
【抽象那些事】命令式抽象
命令式抽象 这种坏味是由操作转换为类引起的,表现为类中只定义了一个方法,有时候类名和方法名相同。这种坏味还常常表现为方法操作的数据位于另一个类中。 为什么不能命令式抽象? 面向对象的基本原则是,识别真实世界中的事物,并使用抽象来表示它们。在解决方案域中,必须将问题域的对象表示出来,为此可采用映射域实体这一实现手法,抽象的每个类都必须封装数据和相关的方法。只包含一个操作的类根本不是抽象,其操作的数据位于其它地方时尤其如此。这样很多操作相同数据的方法位于不同的类中,减低了类的内聚性,违反了封装和模块化原则。 命
撸码那些事
2018/06/21
4140
抽象类和抽象方法
  父类要体现所有子类的共同特征,在设计某些方法(行为特征或功能)时,我们发现父类中无法给出合理的具体实现,而应该交由子类来实现,那么这样的方法就应该设计为抽象方法,而包含抽象方法的类就必须为抽象类。
别团等shy哥发育
2023/02/25
5110
抽象类和抽象方法
智能数据库客户端工具真香!
今年最火的 IT 技术当属 AIGC,AI 已经应用到各种场景,最近在逛github时候发现了一个智能且多功能的多数据库客户端工具--Chat2DB,目前在GitHub上标星8k+。
永恒君
2023/09/02
5260
智能数据库客户端工具真香!
数据库PostrageSQL-客户端认证
当一个客户端应用连接一个数据库服务器时,它将指定以哪个PostgreSQL 数据库用户名连接,就像我们以一个特定用户登录一台 Unix 计算机一样。在 SQL 环境中,活动的数据库用户名决定对数据库对象的访问权限 — 详见Chapter 21。因此,它本质上是哪些数据库用户可以连接。
cwl_java
2020/11/16
1.8K0
java抽象类和抽象方法[通俗易懂]
3.2抽象类中的子类,必须重写抽象父类中所有的抽象方法,否则编辑无法通过会报错。除非该子类也是抽象类。
全栈程序员站长
2022/09/06
9530
java抽象类和抽象方法[通俗易懂]
java基础-抽象类抽象方法
你好! 这篇文章将讲述java中的抽象类和抽象方法的知识点,这个是最简单的,也是最容易被遗忘的。
编程大道
2019/07/15
8230
java基础-抽象类抽象方法
Java 抽象类和抽象方法
什么是抽象类,就像“颜色”,有很多颜色,这是抽象;你问有什么颜色,红蓝绿,这就是实例化
用户2965768
2019/03/04
5340
Ts中抽象类和抽象方法
抽象类不能被实例 用abstract关键字定义抽象类和抽象方法 定义的抽象方法不去实现,但继承的子类必须去实现
明知山
2021/04/08
1.1K0

相似问题

在蛋糕模式中抽象数据库客户端

12

Http客户端抽象层

13

<ApolloConsumer>的抽象客户端

10

抽象数据库访问

115

抽象数据库实体

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文