11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

别再用 MongoDB 了!

  • 2015-07-22
  • 本文字数:2053 字

    阅读完需:约 7 分钟

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 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-07-22 08:35100434
用户头像

发布了 1008 篇内容, 共 346.7 次阅读, 收获喜欢 330 次。

关注

评论

发布
暂无评论
发现更多内容

在nodejs中创建child process

程序那些事

多线程 事件驱动 nodejs 并发 程序那些事

产品 0 期 - 第二周作业

vipyinzhiwei

产品经理训练营

Vue.js笔试题解决业务中常见问题

我是哪吒

程序员 面试 Vue 大前端

第九周作业&总结

胡益

开发质量提升系列:checklist 投产检查列表(下)

罗小龙

代码质量 28天写作 checklist

产品经理训练营第 0 期 第二次作业

孙行者

第0期 产品经理训练营

Postgreshub中文资源网介绍

PostgreSQLChina

数据库 postgresql 开源 软件 开源社区

第二周-作业-胡赵凯

hisun胡

产品经理 产品经理训练营

甲方日常 89

句子

工作 随笔杂谈 日常

给新春一台S,给用户三个S:华为智慧屏的新旅程

脑极体

范文写作结构分析之“危险的分工”

JiangX

28天写作

精选算法面试-哈希表III

李孟

面试 算法

惊呆了!某东Java大咖的MySQL笔记手册流传出来了,胜过看10本书

Java架构之路

Java 程序员 架构 面试 编程语言

同VLAN不同网段能否ping通

产品质量战略

俊毅

spring中那些让你爱不释手的代码技巧(续集)

Java架构师迁哥

连肝7个晚上,总结了计算机网络的知识点!(共66条)

我是哪吒

程序员 面试 浏览器 计算机网络 HTTP

boltdb源码阅读

行如风

数据库 源码剖析 Go 语言

第二周-总结-胡赵凯

hisun胡

产品经理 产品经理训练营

阿里巴巴十亿级并发系统设计手册已开源(2021最新版)

比伯

Java 编程 架构 面试 计算机

Flink 中极其重要的 Time 与 Window 详细解析(深度好文,建议收藏)

五分钟学大数据

大数据 flink

懂点EXCEL就行!教你利用Python做数据筛选(上)

智分析

Python Excel 数据清洗

图解计算机中的数据表示形式

冰河

程序员 计算机 二进制数据

Logi-KafkaManager开源之路:一站式Kafka集群指标监控与运维管控平台

张亮

Java 大数据 kafka 开源 消息队列

产品经理训练营 - 第二次作业

Jophie

产品经理训练营

极客时间产品训练营第二周总结

云随心

产品 总结 产品训练营

产品思维和意识

让我思考一会儿

2020出行之变(三):智能交通的星罗棋布

脑极体

别再用MongoDB了!_数据库_谢丽_InfoQ精选文章