66

最近我一直在玩弄 Node.js。在我的特殊情况下,我最终使用了 MongoDB,部分原因是它对那个项目很有意义,因为它非常简单,部分原因是 Mongoose 似乎是一种非常简单的入门方式。

我注意到在使用 Node.js 时似乎对关系数据库有一定程度的反感。与 Node.js 生态系统中的非关系数据库相比,它们的支持似乎很差,但我似乎找不到一个简洁的原因。

所以,我的问题是,关系数据库比 MongoDB 等替代品更不适合使用 Node.js 是否有可靠的技术原因?

编辑:只是想澄清一些事情:

  • 我不是专门寻找与我正在构建的特定应用程序相关的详细信息
  • 我也不是在寻找非技术原因(例如,我不是在寻找“Node 和 MongoDB 都是新的,所以开发人员一起使用它们”这样的答案)

我正在寻找的完全是技术原因,仅。例如,如果关系数据库在与 Node.js 一起使用时表现异常糟糕是有技术原因的,那么这就是我正在寻找的那种东西(请注意,从目前的答案来看,这似乎不是案子)

4

5 回答 5

39

不,没有技术原因。这主要只是意见,将 NoSQL 与 Node.js 结合使用是目前流行的选择。

诚然,Node 的生态系统很大程度上是由社区驱动的。Node核心 API之外的一切都需要社区参与。而且,当然,人们将更有可能支持符合他们个人喜好的东西。

但是,许多人仍然使用 Node.js 并支持关系数据库。一些值得注意的项目包括:

于 2013-08-22T09:41:21.317 回答
30

我喜欢 Node.js,但对于 Node,实际上使用 RDBM 比使用非关系数据库更有意义。使用 noSQL/非关系解决方案时,您经常需要在 Node.js 代码中进行手动连接,并且有时需要在缺少事务的情况下工作,这是具有提交/回滚功能的 RDBM 的技术特性。以下是使用非关系数据库 + Node.js 服务器的一些潜在问题:

(a) 连接速度较慢,响应速度较慢,因为 Node 不是 C/C++

(b) 昂贵的连接会阻塞您的事件循环,因为连接发生在您的 Node.js 代码中,而不是在某些数据库服务器上

(c) 手动编写连接通常很困难且容易出错;您的 noSQL 查询很容易不正确,或者您的连接代码可能不正确或次优;RDBM 的大师们之前已经完成了优化连接,并且在大多数情况下,RDBM 中的连接在数学上被证明是正确的。

(d) 一些非关系型数据库,如 MongoDB,支持事务——在我的团队中,这意味着我们必须使用外部分布式锁,以便可以将多个查询组合成一个原子事务。如果我们可以只使用事务并避免应用程序级别的锁,那会更容易一些。

有了一个更强大的关系数据库系统,可以在数据库服务器上使用 C/C++ 而不是在您的 Node.js 代码中进行优化连接,您可以让您的 Node.js 服务器做它最擅长的事情。

话虽如此,我认为许多主要的 noSQL 供应商不支持连接是非常愚蠢的(?)就我所见,完全非规范化只是一个梦想。缺乏交易可能有点奇怪。没有事务,只有一个查询是原子的,如果没有应用程序级别的锁定机制,您无法使多个查询成为原子的:/

外卖:

如果您想要非关系持久性 - 为什么不简单地对关系数据库进行反规范化?没有人强迫您以关系方式使用传统数据库。

如果您将关系数据库与 Node.js 一起使用,我推荐这个 ORM: https ://github.com/typeorm/typeorm

顺便说一句,我更喜欢术语“非关系”而不是“noSQL”。

于 2015-10-27T07:33:34.163 回答
15

根据我的经验,节点往往在具有无状态 API 的数据库中流行,这非常适合节点异步性质。大多数关系数据库使用状态连接进行事务处理,这最大限度地减少了异步非块 i/o 的主要优势。

于 2016-09-05T03:09:44.717 回答
11

您能否准确解释您选择的数据库和 node.js 所面临的具体问题?

MongoDB 比关系数据库更受欢迎的几个原因:

  • MongoDB 本质上是一个 JSON 对象存储,因此它可以很好地转换为 javascript 应用程序。MongoDB 函数是 javascript 函数。

  • 我只是在这里猜测,但由于 NoSQL 数据库较新并且有更多热心的程序员尝试使用它,您可能会更多地参与这些 NPM 模块。

除此之外,Node.js 在技术上是任何类型的数据库应用程序的完美选择。我亲自参与过一个小型 Node.js/MySQL 应用程序,我没有遇到任何障碍。

但回到我的主要观点,我们可以整天谈论这个,这不是这个论坛的目的。如果您在使用 Node.js 和您选择的数据库的任何代码中遇到任何特定问题,请改为提出这些问题。

编辑:严格的技术原因,除了双方的 JSON 兼容性:没有。

于 2013-08-22T12:06:29.123 回答
1

有人在 2021 年想知道同样的问题-

  1. 节点与您选择的数据库类型无关。

  2. 您可以根据需要选择您选择的数据库。如果您需要维护严格的数据结构,请选择关系数据库,否则您可以选择 NO-SQL。

  3. 有用于 PostgreSQL、MySql 和其他非阻塞数据库的 NPM 包。这些 db 客户端在执行查询时不会阻塞 Node 进程。

于 2021-08-22T07:57:36.500 回答