为什么你应该永远不要再使用MongoDB

Sven Slootweg (joepie91)是一名黑客,同时也是CrytoCC的创建者,现在提供Node.js代码评审服务。近日,他在个人博客上发表了一篇博文《为什么你应该永远、永远、永远不要再使用MongoDB》。在文中,他列举了如下理由:

  • 丢失数据(见1、2);
  • 默认忽略错误,假设每次写入都是成功的,在32位系统上,这可能会导致数据无声无息地丢失;
  • 即使是在MongoDB宣传的适用场景下,其性能依然不高(见3、4);
  • 几乎在所有的应用场景下,开发者都会被迫养成使用隐式模式的坏习惯(见4);
  • 存在锁问题(见4);
  • 对安全问题响应很慢(见5);
  • 不符合ACID(见6);
  • 扩展和维护困难;
  • JSON存储也不是MongoDB独有的功能,PostgreSQL、CouchDB也支持(见7、8)。

joepie91认为,MongoDB不仅存在诸多问题,而且并无突出之处。如果项目涉及用户账户或者两条记录之间存在某种关系,那么就应该使用关系型数据库,而不是文档存储;如果项目在使用Mongoose,那么也应该使用关系型数据库,因为Mongoose只是使用文档存储模拟了有模式的关系型数据库。因此,大多数情况实际上需要的都是一个关系型数据库。在这些情况下,PostgreSQL是个不错的可选方案。开发者可以使用查询构建器或ORM来简化使用过程,比如,在Node.js中,可以选用Knex、Bookshelf、Sequelize或Waterline。即使真得需要一个文档存储,那么也有比MongoDB更好的选项。另外,他也不认为MongoDB适合于创建原型,因为如果生产环境使用不同的数据库,则还需要重写所有的代码。总之,MongoDB并没有什么适用场景。它在技术上比不上其它可选方案,并没有提供真正有用的独有的特性,而且开发人员也无法确保数据一致性和安全。最后,joepie91指出,流行度并不等同于质量,只能说明产品有一个不错的市场团队:

永远不要因为“其他人那样做”就使用一个数据库,对于一个特定的数据库,要自己研究它的优点和不足。

joepie91的观点在Hack News上得到了广泛的赞同。网友karmakaze也认为,有了PostgreSQL 9.4,就没有任何理由要使用MongoDB了(JSONB比BSON更合用),另外还可以使用CouchDB。对于MongoDB的具体限制,网友giaour建议阅读aphyr的系列文章Call Me Maybe,并指出,虽然存在已知的变通方案,但那大大降低了MongoDB的开发体验。网友Animats认为,如果站点的流量比维基小,那么使用某种关系型数据库就可以了。网友PebblesHD有类似的观点:

作为一个规模较小的部署……,只安装一个基本的MySQL有什么问题吗?在我们的内部维基上,我们每天的访问量已经超过了2万次……

但是也有一些不同的声音。例如,网友threeseed就表示,MongoDB仍然是最容易安装和使用的数据库之一。对此,joepie91回复如下:

以错误的方式做事,想不容易都难——MongoDB恰好就是那么做的。它不需要设置身份验证或表模式,因此才看上去“易于安装”。但实际上,为了节省10分钟,你正在浪费几个小时的时间。因为稍后,你将会遇到入侵(没有身份验证)或数据破坏……

Shodan的报道也佐证了joepie91的这一说法,互联网上有将近3万个MongoDB实例没有启用任何的身份验证。这个问题随处可见,而且已经存在多年。

网友toyg则评论说:

我最近首次使用了MongoDB,是在一个内部项目里。我认为,没有模式确实显著了提升了开发速度……现在项目已经成熟,回过头来,我可以看到为什么关系型数据库会更合适,但如果我从开始就使用RDBMS,那么我可能无法这么快地完成迁移。虽然切换到真正的RDBMS意味着要修改三两个类,但变化不大。所以,我不同意MongoDB不适合原型开发的说法。

joepie91对“修改三两个类,但变化不大”的说法提出了质疑,因为根据自己从事代码审查的经验,迁移到不同的数据库通常需要大量的工作。至于切换速度,joepie91指出,在一个有回滚机制的系统中,可能会更快。

然而,在有些情况下,开发者并没有其它选择。例如,有网友就提出,Meteor就使用而且只能使用MongoDB。而由于同Hadoop的合作伙伴关系,MongoDB同Hadoop有很好的集成,因此,它在大数据分析领域非常流行。

另外,来自SourceGear的软件开发人员Eric Sink在读过的joepie91文章之后表示:

(他所列举的内容)部分(也许全部)确有其事。事实上,现在,就假设他所写的都是正确的。我这里不是要说作者是错的。更确切地说,我这里想指出的是,这种博文只能让我了解很少有关MongoDB的知识,但却让我感受到了写这篇博文的人的许多情感。

他觉得,不能因为那些问题就彻底地否定MongoDB,毕竟:

MongoDB是顶级的NoSQL供应商。每天,成千上万的企业用它为数以百万计的用户提供服务。像所有有大量用户的新生软件一样,它有漏洞和缺陷。但它正稳步改善。任何有关技术缺陷的讨论,如果无助于解决问题,那么很大程度上只能是一种情绪的宣泄。

本文最初发表在infoq,文章内容属作者个人观点,不代表本站立场。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-01 22:38:36

为什么你应该永远不要再使用MongoDB的相关文章

《MongoDB 权威指南》 学习总结

书目   http://baike.baidu.com/link?url=DVJuvrT4ssbM8V1pKcoRx5H1CwRRCynC6_Ix6YWIrr414opislflpPuY9hRDO4g-Fr5vL9AfbsvamwaGpvN8G_ 全书翻过+看过博文(http://www.cnblogs.com/huangxincheng/category/355399.html)+自己动手安装过mongoDB写过demo代码(Windows,c#) 总结如下: 语言不错,看着很舒服.像是自然语

MongoDB Linux下的安装和启动

1. 下载MongoDB,此处下载的版本是:mongodb-linux-i686-1.8.1.tgz.tar. http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.1.tgz 2. 解压文件到某目录下,然后重命名: [root@localhost src]# tar -xzvf mongodb-linux-i686-1.8.1.tgz.tar [root@localhost src]# mv mongodb-linux-i686-1.8.

mongoDB之用户及权限设置 转载 还没有仔细查看细节东西

之前用MongoDB没有设置用户和权限,一直都是本机应用程序连接MongoDB.在服务器上部署后对外没有开数据库连接端口,本机应用程序连接再开放应用程序端口供外部访问.想想很不对劲还是设置下用户授权吧. 我部署的环境是windows下MongoDB2.4.8版本.首先要开启安全模式的话,在启动MongoDB服务的时候就要加上--auth参数,命令如下: D:\mongodb>mongod.exe --dbpath D:\mongodb\data --logpath=D:\mongodb\logs

[Cacti] mongodb性能监控实战

前言: 为了更好的使用mongodb,需要监控出mongodb的一些基础使用情况,比如Flush数.连接数.内存使用率.Index操作,Slave延迟等等,这些可以通过配置cacti监控mongodb的模板来完成.  1,在cacti界面导入模板 在计算机本地,下载此tgz包:http://mysql-cacti-templates.googlecode.com/files/better-cacti-templates-1.1.8.tar.gz 解压到任意目录,然后打开cacti的web界面,选

mongodb的一些小总结

mongodb的安装,官网下载想要的版本,可视化工具mongovue(注意不支持mongodb3.0以上的版本) 下载mis安装,解压后bin,... 1.配置环境变量,将H:\mongodb\mongodbInstall\bin bin目录加入环境变量的path里面 2.bin目录同级目录创建data文件夹,data文件夹内新建db.log文件夹log文件夹下再创建mongodb.log 3.输入如下的命令启动mongodb服务:(定位到bin下面) H:/mongodb/mongodbIns

MongoDB.WebIDE:升级版的Mongodb管理工具

很早以前收藏了一片文章:<强大的MongoDB数据库管理工具>.最近刚好要做一些MongoDB方面的工作,于是翻出来温习了一下,用起来也确实挺方便.不过在使用过程中出现了一些个问题,加上更喜欢MongoUVE的操作习惯,于是决定“自己动手,丰衣足食”,写一个升级版的工具. 一.升级的基础内容 原版是用的WebForm开发的,新版打算升级到MVC 前端框架使用bootstrap Mongodb的驱动程序改为使用官方版的驱动程序 原版查询数据时使用的是解析sql语句的方式,新版打算采用javasc

mongoDB之用户及权限设置

之前用MongoDB没有设置用户和权限,一直都是本机应用程序连接MongoDB.在服务器上部署后对外没有开数据库连接端口,本机应用程序连接再开放应用程序端口供外部访问.想想很不对劲还是设置下用户授权吧. 我部署的环境是windows下MongoDB2.4.8版本.首先要开启安全模式的话,在启动MongoDB服务的时候就要加上--auth参数,命令如下: D:\mongodb>mongod.exe --dbpath D:\mongodb\data --logpath=D:\mongodb\logs

MongoDB与内存

来自  http://www.ttlsa.com/mongodb/mongodb-and-memory/# 但凡初次接触MongoDB的人,无不惊讶于它对内存的贪得无厌,至于个中缘由,我先讲讲Linux是如何管理内存的,再说说MongoDB是如何使用内存的,答案自然就清楚了.据说带着问题学习更有效,那就先看一个MongoDB服务器的top命令结果: 1 2 3 4 5 shell> top -p $(pidof mongod) Mem: 32872124k total, 30065320k us

MongoDB数据库,windows平台的安装

最近在学习慕课网站的nodejs建站课程,里面有一个MongoDB数据库的安装,视频作者没有讲到,因此自己去查找了资料安装了一下,这里记录一下安装的过程. 首先登陆MongoDB的官方网站下载官方windows平台安装包,下载点击安装,修改安装路径为C盘的根路径下为 C:\MongoDB\ 安装之后打开文件路径再 C:\MongoDB\ 下新建文件 mongo.config用编辑器打开填写一下内容 dbpath=D:\mongodb\data\db logpath=D:\mongodb\log\