问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何评价InfoQ文章《别再用MongoDB了,》

发布网友 发布时间:2022-04-24 19:39

我来回答

1个回答

热心网友 时间:2022-04-27 23:53

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供应商。每天,成千上万的企业用它为数以百万计的用户提供服务。像所有有大量用户的新生软件一样,它有漏洞和缺陷。但它正稳步改善。任何有关技术缺陷的讨论,如果无助于解决问题,那么很大程度上只能是一种情绪的宣泄。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
长春小飞没有车没有房 碳钢的多久生锈 碳钢多久会生锈 碳钢多长时间会开始生锈 碳钢和铝哪个容易生锈 梦见天宫图是什么意思 光遇2023好友树解锁图鉴 光遇二级节点多少个 ...火柴小女孩》《词语手册》里有很多词语的意思的,求告知 暖融融解释 领淘通淘客助手这个软件怎么样? 10T量级的数据量,且每年会增加1T的数据量,Mysql与Postgresql哪个选型会更好一点? 开源数据库有哪些 MongoDB在商业使用时会有丢失数据的问题么 为什么我从 MongoDB 迁移到 PostgreSQL postgresql 的 json 能力是不是已经超越了 mongodb mongod稳定吗?还是postgresql稳定 为什么PostgreSQL比MongoDB还快 如何泡红茶,才不会又苦又涩 红茶应该怎么喝对身体好? 红茶应该怎么泡才好喝? 怎样喝红茶? 红茶怎么泡才好喝? 红茶怎么喝最好? 360和手机管家哪个比较好用,杀毒厉害一点? 苹果手机里腾讯管家怎么设置软件锁? 请问Led灯一直亮着,是怎么回事的 求助,刚刚入手的康佳 LED55K60U KKTV,怎么root 香港公司申请大陆专利不予受理的情形有哪些? led显示屏幕耗电量,节能大屏幕的功率是多少 香港申请大陆专利申请受理有哪些范围? word怎么去除显示修订 手机号码中间5位快速查询方法 oppo本机手机号查询方法 UK插入电脑显示你的连接不是专用连接 电脑专用音箱怎么连接电脑?电脑专用音箱只有一个数据线,一个USB接口,怎么连接电脑呢?(电脑为旧款) 电脑专用稳压器怎么连接到台式电脑上使用 现在电脑连接网络一般用什么方式连接? 电脑怎么连接专用麦克风 电脑用什么接口跟电视机连接 两台电脑连接用什么线 家里的电脑在连接网络的时候是设置公用网络还是专用网络? 公司建立了虚拟专用网络新电脑该如何连接? 两台计算机连接用什么线? 电脑有专用的工作网络,怎样可以连接互联网么? 两台电脑可以用USB连接吗 建行网上银行怎么登录 国际上网是什么意思? 怎样登陆建行网上银行 飞机飞行的原理 是? 飞行的原理!