关系数据库是否适合Node.js?

时间:2013-08-22 09:08:22

标签: node.js relational-database

最近我一直在玩Node.js。在我的特殊情况下,我最后使用了MongoDB,部分原因是它对该项目有意义,因为它非常简单,部分是因为Mongoose似乎是一种非常简单的开始使用它的方法。

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

所以,我的问题是,是否存在一个可靠的技术原因,为什么关系数据库比使用MongoDB等替代方案更适合使用Node.js?

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

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

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

4 个答案:

答案 0 :(得分:29)

不,没有技术原因。这主要是观点,使用NoSQL和Node.js目前是一个受欢迎的选择。

当然,Node的生态系统是largely community-driven。除了Node core API之外的所有内容都需要社区参与。而且,当然,人们更有可能支持与个人偏好相符的东西。

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

答案 1 :(得分:21)

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

  

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

     

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

     

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

     

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

使用更强大的关系数据库系统,可以在数据库服务器上而不是在Node.js代码中对C / C ++进行优化连接,您可以让Node.js服务器尽其所能。

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

<强>外卖:

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

如果你使用Node.js的关系数据库,我推荐这个ORM: https://github.com/typeorm/typeorm

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

答案 2 :(得分:11)

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

答案 3 :(得分:8)

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

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

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

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

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

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

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