MongoDB:逐渐变得无关紧要
我与MongoDB的关系可分为三个阶段。对于目前处于第三阶段的我来说,这款产品似乎变得无关紧要了。很快你就会明白为什么我这么说。
阶段一:痴迷
我与MongoDB的第一次接触十分神奇:一个poliglot持久性架构用它来处理部分系统,而框架的关系模型却不是很适合。然而它运行得十分漂亮:快速、易于安装和使用,并且运转良好。不得不说,MongoDB很适合应用于此类情况。
它的表现震惊了我:事实上,我主要的查询语言是JavaScript,这已经十分了不起。我从未奢望类似的东西能运行得如此出色。在那段时间里,我详细了解了这款产品以及如何管理它配给的文档模型。
阶段二:现实
也许这个阶段更好的名字应该是成熟。在这个阶段,我知道在什么情况下该使用MongoDB,更重要的是,什么时候不该使用MongoDB。这时,你会发现MongoDB是一款很好却需要谨慎使用的产品。它提供的文档模型强大到能帮你解决很多但却不是全部问题:实际上,只是相当多而已。
我是从自己和别人的失败上意识到了这个问题。很多人非常兴奋的想要把世界简化成一个模式,于是MongoDB就可以成为所有问题最完美的解决方法。但每当这些时刻,一些不符合想象却真实存在的事实就会砸到你脸上证明你的想法是错误的:
关系模型并没有它们表现的那么糟糕。事实上,这种模式目前十分流行,而且在未来很长一段时间内它的地位都不会改变,究其原因:它管用。并且与NoSQL相反,我们手里有各种适用于此模式的好的或者坏的的实践方法。
ACID事务。MongoDB有一点恼人的地方:不能创建一个事务处理多个文档。于是问题来了:多数情况下,你必须同时进行多文档处理。
在你知道你的系统需要什么之前,所有以上谈到的强大性能,都和你关系不大。
在这个阶段,所有的激动人心和相见恨晚都消失了,这是所有人都会有的。这时,你会知道这款工具可以做什么以及不能做什么。这是最好的阶段。
阶段三:无关紧要
现在MongoDB对于我来说已经变得无关紧要了。当然不是指文档模型,而是产品。有一天早上我醒来,突然意识到我不再需要MongoDB了,因为对于我的项目来说,其替代品更具吸引力。它们是分批来的。
第一波:TokuMX
TokuMX是MongoDB的一个分支,我喜欢称之为“MongoDB迷人的双胞胎兄弟”。它与MongoDB使用同样的通信协议,采用基本相同的命令,并可与MongoDB 100%兼容。但它具有一些MongoDB没有的强大优势:
可以进行多文档ACID处理。
快于MongoDB(快50倍速)。
存储消耗比MongoDB少90%。
与MongoDB 100%兼容。所有你需要做的就是将MongoDB实例更换成TokuMX,然后转移数据(这是相当容易的),这样你就大功告成了。
是的,与MongoDB一样,它也是开源的,而且有运行非常好的免费版本。当然,它也不是完全无懈可击。它有两个局限:
没有Windows发布(Distribution )。
目前Java库还不能提供MongoDB ACID执行的本地支持。它可以使用,但仍需要一些样板代码。
TokuMX第一次让我意识到MongoDB对我来说似乎无关紧要。当然,这可能只是暂时的:在日后版本发布后,MongoDB仍有可能击败TokuMX。但是,也只能寄希望于日后版本。目前为止,它做不到。
第二波:PostgreSQL
如果说TokuMX让我觉得MongoDB无关紧要,那么PostgreSQL 9.2则强化了这一印象。自9.2版本,PosetgreSQL开始对JSON和JSONB数据类型提供支持。这是一个有意思的解决方案,因为它,我可以得到关系模型中具有文档灵活性的好的部分。而所有这一切都基于同样的产品。太好了!
但是MongoDB曾比PostgreSQL的具有更高性能。我说“曾”是因为PostgreSQL 9.4版本使其变成了历史:最近的基准显示,PostgreSQL在处理JSON数据类型上比MongoDB更快。我没有想要比较PostgreSQL和TokuMX,但鉴于两者现在都比MongoDB拥有更好的性能,我想大家已经清楚我的观点了。
结论
与 TokuMX 和 PostgreSQL 相比较使得 MongoDB 处于劣势。但它仍然是一款很好的产品,而且会继续改进来与这些替代产品竞争,然而目前来看它最多只能排在第三名。不过资本市场对 MongoDB 非常认可,最新消息显示,2015年MongoDB获8000万美元融资,估值超过15亿美元。期待MongoDB的改进和发展。
MongoDB:逐渐变得无关紧要的更多相关文章
- mongodb安装&简单使用
转自Mac下使用brew安装mongodb,按着步骤已成功安装. brew常用命令 1.更新brew本身 brew update 2.使用brew安装软件 1 brew install soft_na ...
- 在express中使用Mongoose连接MongoDB
为何要学Mongoose? Mongoose是MongoDB的一个对象模型工具,封装了MongoDB对文档的的一些增删改查等常用方法,让NodeJS操作Mongodb数据库变得更加灵活简单. 0.安装 ...
- [转] mongoDB与mongoose
mongoDB简介 mongoDB与一些关系型数据库相比,它更显得轻巧.灵活,非常适合在数据规模很大.事务性不强的场合下使用.同时它也是一个对象数据库,没有表.行等概念,也没有固定的模式和结构,所有的 ...
- MongoDB学习之mongoose
MongoDB介绍: MongoDB是基于Javascript语言的数据库,存储格式是JSON,而Node也是基于JavaScript的环境(库),所以node和mongoDB的搭配能减少因为数据转换 ...
- 011.MongoDB性能监控
一 MongoDB 监控 1.1 监控概述 MongoDB自带了mongostat 和 mongotop 这两个命令来监控MongoDB的运行情况.这两个命令用于处理MongoDB数据库变慢等等问题非 ...
- MongoDB快速入门教程 (4.2)
4.2.Mongoose实现增删查改 中文文档地址: https://cn.mongoosedoc.top/docs/guide.html 4.2.1.Mongoose是什么? Mongoose是Mo ...
- 《The Evolution of Lua》翻译part 2
Lua2 1990年的时候,面向对象迈向巅峰,对于Lua没有面向对象的支持,我们受到了很大的压力.我们不想将Lua变成面向对象,因为我们不想“修复”一种编程范式(fix a programming p ...
- lecture11-hopfiled网络与玻尔兹曼机
Hinton课程第11课 这部分的课程算是个知识背景,讲述RBM的来源吧,毕竟是按照hopfield--BM-RBM的路线过来的. 因为水平有限,都是直译,如果纠结某句话,肯定看不懂,所以这些课程只需 ...
- mongoose学习笔记1--基础知识1
今天我们将学习Mongoose,什么是Mongoose呢,它于MongoDB又是什么关系呢,它可以用来做什么呢? MongoDB是一个开源的NoSQL数据库,相比MySQL那样的关系型数据库,它更显得 ...
随机推荐
- Extjs4 RowEditing 的使用和更新方法
如何灵活快速的掌握RowEditing组件的应用,应大家的要求,今天给大家具体讲下该组件的使用. 1.创建 var rowEditing = Ext.create('Ext.grid.plugin.R ...
- Invalid embedded descriptor for ".proto".Dependencies passed (Protobufer)解决办法
前言 之前开发的时候,发现居然出现了Dependencies passed to FileDescriptor.buildFrom() don't match those listed in the ...
- C语言 - 结构体(struct)比特字段(:) 详细解释
结构体(struct)比特字段(:) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511 结构体(struc ...
- hdu1881(贪心+dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1881 分析:按照结束时间从小到大排序,然后以每个结束点为容量进行01背包,选入的必定符合条件的. 因为 ...
- Android的内存优化
腾讯公司在五月三十一日开展[腾讯Bugly移动开发人员沙龙]大会.大会上面叶方正老师解说了 关于Android的内存优化的问题,只是我感觉叶老师许多其它的站在了測试的角度上去解释了这一方面,叶老师给我 ...
- I2C操作笔记——以 AT24C04为例
1.前言 对于大多数project师而言,I2C永远是一个头疼的问题.相比UART和SPI而言,I2C的时序要复杂一些,I2C组合变化也丰富一些.在这里以AT24C04为例说明I2C使用过程中 ...
- 京东商城招聘匹配系统资深工程师 T4级别
岗位级别:T4 岗位职责: 1.负责匹配系统的架构设计 2.负责网页抽取.实体识别.匹配等算法设计 3.核心代码编写,代码review 任职要求: 1.熟悉机器学习.自然语言处理理论和算法2.三年以上 ...
- EJBTimer 使用EJB提供的定时器
一.说明 EJB提供的定时器有两种,自动定时器和自定义定时器,自动定时器设置使用简单但是扩展较为麻烦,自定义定时器有较好的扩展性. 下面的例子中是把两中方式放到了一个测试类中. 二.示例 import ...
- URAL 1297 后缀数组:求最长回文子串
思路:这题下午搞了然后一直WA,后面就看了Discuss,里面有个数组:ABCDEFDCBA,这个我输出ABCD,所以错了. 然后才知道自己写的后缀数组对这个回文子串有bug,然后就不知道怎么改了. ...
- Android 一些错误
android fragment里面放viewpager 嵌套fragment 报错: 解决:在adapter的构造方法里加上 super(fragment.getChildFragmentManag ...