关系数据库是不是不适合 Node.js?
Posted
技术标签:
【中文标题】关系数据库是不是不适合 Node.js?【英文标题】:Are relational databases a poor fit for Node.js?关系数据库是否不适合 Node.js? 【发布时间】:2013-08-24 22:10:22 【问题描述】:最近我一直在玩弄 Node.js。在我的特殊情况下,我最终使用了 MongoDB,部分原因是它对那个项目很有意义,因为它非常简单,部分原因是 Mongoose 似乎是一种非常简单的入门方式。
我注意到在使用 Node.js 时似乎对关系数据库有一定程度的反感。与 Node.js 生态系统中的非关系型数据库相比,它们的支持似乎很差,但我似乎找不到一个简洁的原因。
所以,我的问题是,是否有可靠的技术原因说明关系数据库比 MongoDB 等替代方案更不适合使用 Node.js?
编辑:只是想澄清一些事情:
我并不是专门寻找与我正在构建的特定应用程序相关的详细信息 我也不是在寻找非技术原因(例如,我不是在寻找“Node 和 MongoDB 都是新的,因此开发人员可以一起使用它们”之类的答案)我正在寻找的完全是技术原因,只是。例如,如果关系数据库在与 Node.js 一起使用时表现异常糟糕是出于技术原因,那么这就是我正在寻找的那种东西(请注意,从目前的答案来看,这似乎不是案例)
【问题讨论】:
这已在其他地方关闭:programmers.stackexchange.com/questions/198224/… 【参考方案1】:任何人在 2021 年想知道同样的问题-
节点与您选择的数据库类型无关。
您可以根据需要选择您选择的数据库。 如果你需要保持严格的数据结构,那么选择关系数据库,否则你可以选择 NO-SQL。
有用于 PostgreSQL、mysql 和其他非阻塞数据库的 NPM 包。这些 db 客户端在执行查询时不会阻塞 Node 进程。
【讨论】:
【参考方案2】:我喜欢 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”。
【讨论】:
Node 使用 Chrome V8,它是开源的 Chromium C++(数组函数非常快),而现在的无头 Chrome 比 PhantomJS 更好,这已经被弃用了 (a) 说连接速度较慢,因为 Node.js 不是 C++,但实际上应该是,因为 Chrome V8 使用 C++ 原生对应物转换和优化数组函数 我明白你在说什么。我认为这只是外部数据的问题,而不是 Node.js 正在管理数据库或与数据库交互。通常,JS 本机代码通过事件处理工作,因此每个 env / 线程 / 进程可以在等待潜在响应时做其他事情,但我认为你是对的,它会涉及深度复制 / 字符串化的迭代,以便Node.js 数据可以在高性能服务中摄取 *人们之所以使用JS而不是C++,是因为C++需要更多的工作,但是对于数据库,C++已经写到一定程度了,所以还是用吧。 对我上面所说的修改:看起来JS代码编译一次,然后基本上所有东西都在V8(C++土地)中执行,所以数据不穿过JS据我目前所知,每次 I/O 调用都到 C++ 边界。【参考方案3】:根据我的经验,节点往往在具有无状态 API 的数据库中很受欢迎,这非常适合节点异步性质。大多数关系数据库使用状态连接进行事务处理,这最大限度地减少了异步非块 i/o 的主要优势。
【讨论】:
最有意义。两个最佳答案具有误导性,这些人不了解 NoSql 架构设计。他们像 rel dbs 一样进行设计、规范化等等,然后抱怨他们想要交易。【参考方案4】:您能否准确解释您选择的数据库和 node.js 所面临的具体问题?
MongoDB 比关系数据库更受欢迎的几个原因:
MongoDB 本质上是一个 JSON 对象存储,因此它非常适合 javascript 应用程序。 MongoDB 函数是 javascript 函数。
我只是在这里猜测,但由于 NoSQL 数据库较新并且有更多热心的程序员尝试使用它,您可能会更多地参与这些 NPM 模块。
除此之外,Node.js 在技术上是任何类型的数据库应用程序的完美选择。我亲自参与过一个小型 Node.js/MySQL 应用程序,我没有遇到任何障碍。
但回到我的主要观点,我们可以整天谈论这个,这不是这个论坛的目的。如果您在使用 Node.js 和您选择的数据库的任何代码中遇到任何特定问题,请改为提出这些问题。
编辑:严格的技术原因,除了双方的 JSON 兼容性:没有。
【讨论】:
我已经稍微澄清了我的问题,以排除非技术性的答案。我只是出于完全技术原因(如果有的话)寻找开发人员不应将关系数据库与 Node.js 一起使用的原因。 @MatthewDaly 严格的技术原因,除了双方的 JSON 兼容性:没有。随意将您的 Node.js 与您的关系数据存储一起使用。只要它是像 MySQL 或 PostgreSQL 这样流行的,你不应该遇到任何问题。【参考方案5】:不,没有技术原因。这主要只是意见,在 Node.js 中使用 NoSQL 目前是一种流行的选择。
当然,Node 的生态系统是 largely community-driven。 Node 的core API 之外的一切都需要社区参与。而且,当然,人们更有可能支持符合他们个人喜好的东西。
但是,许多人仍然使用 Node.js 并支持关系数据库。一些值得注意的项目包括:
mysql
pg
sequelize
【讨论】:
这可能是我见过的最悲伤的答案之一 - MongoDB 和 RDBM 等之间存在巨大的技术差异 @AlexanderMills 数据库类型之间肯定存在差异,但这并不意味着关系数据库不适合与 Node.js 一起使用。 对,我同意,请参阅我的回答以了解技术差异 见***.com/a/39323415/3486720。 Node.js 仅适用于异步非阻塞交互,例如使用 MongoDb。不要将它与 RDBMS 一起使用。以上是关于关系数据库是不是不适合 Node.js?的主要内容,如果未能解决你的问题,请参考以下文章