简述
工作中经常接触MongoDB,学习上也有对它进行一些研究,感觉MongoDB这种Nosql类型的数据库给我在开发上带来很多便捷,同时也解决了很多程序开发过程中在性能上考虑优化的可行方案。然而最近我在思考MongoDB看起来很棒,用起来很舒服,但是我是否对其抱有过分自信和过分依靠它呢?我想聊聊MongoDB的一些我比较看重地方,还有它隐藏的一些缺陷(可能暂时不明显,但是日后可能会成为你自己亲手埋下的地雷)。
简述MongoDB和NoSQL
MongoDB
MongoDB,是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB,是一个介于关系数据库(sql)和非关系数据库(nosql)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型(这一点是我很喜欢,因为我经常会把一些经常使用的数据预先生成存进MongoDB,,相当于缓存的做法)。
Mongo,最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引(MongoDB的索引很多,没记错应该有7种,功能完善且强大,有力支持了高效查询)。
目前MongoDB的最新版本为3.0+,最新版本的MongoDB在我看来更像sql的nosql数据库,功能更是越发强大。
NoSQL
NoSQL,泛指那些支持非关系型、分布式数据存储的数据库,最常见的解释是“non-relational”或“Not Only SQL”,而“NoSQL”一词最早于1998年被用于一个轻量级的关系数据库的名字。
NoSQL被我们用得最多的当数key-value存储,当然还有其他的文档型的(这个我用的比较多,其次是k-v存储)、列存储、图型数据库、xml数据库等。
NoSQL有很多优势:NoSQL数据库非常易于扩展;NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,高性能更为突出;NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构(这个观点我不太懂,网上给的经验,可能大平台才会体验到吧)。
一些主流的NoSQL介绍:MongoDB;SequoiaDB;Cassandra。这是目前生产线上主流的三大NoSQL数据库,有兴趣大家可以去了解一下。
小结
通过简述MongoDB和NoSQL,相信我们对非关系型数据库的了解能有一定收获了吧,了解一件事物,首先我们必须认识它,现在我们认识了,接下来就是了解它了。
我与MongoDB
我与MongoDB的接触与感悟
我对MongoDB的接触经常是进行数据整理,数据加工的时候会用到它,一般面对一些复制的涉及多表联合查询的业务逻辑时,我想跳过多表联合查询寻找在页面加载时程序获取数据的最快捷最高效的处理方案,这时MongoDB给了我一个不错的选择(因为MongoDB存储的是字符串文本而且是支持一对多关系结构),这给了我两个思考点:
第一、我是否可以对复杂的数据进行预处理,放到MongoDB上面,页面需要用到的时候直接拿来用,这样我只需要读一次MongoDB就可以了,从而避免多次查表给服务器带来的压力,再说MongoDB对于高并发的负载能力也是很强大的。
第二、面对一对多的映射关系我是否可以用MongoDB集合的一对多映射解决sql的多个关联表的冗杂。
有的时候我甚至觉得MongoDB不再像是数据库,它更像是缓存服务器,因为它更多的是把数据预先存储以备日后使用,但是它跟sql数据库的最新数据往往不全是同步的,有一些出现延时的数据就是我想说的视为缓存的数据,那么问题就来了,怎么更好的保证数据的时效性,我不相信有人希望程序使用旧的数据,所以保持数据的新鲜应该是产品的最优需求,因为一个数据同步更新机制的建立很有必要,到底是定时更新方案还是sql内容更新同步方案好呢(我想出来的两个我认为可行的数据同步方案)?一切根据具体应用场景来具体操作。
有的时候面对一些页面的数据是暂定不会变化,比如新闻内容,对象介绍信息等等一些内容数据,这些数据很少会更新,所以很多情况下会把它们放到MongoDB上,避免重复查表,也可以理解为缓存到MongoDB上面去了(我的理解),但是我们必须主要在程序上不能单单只依靠MongoDB或缓存上面的哪些数据,我们为了避免风险,应该在程序的最后加上原始数据的组装处理,保证数据准确性,因为没人能保证MongoDB永远可靠(这里就提到MongoDB的可靠性,这个争议比较大的,一些人说MongoDB的数据容易丢失,或者在数据迁移上出现问题等等),我的观点的永远不要相信数据库,我们要做好一切问题出现的准备,有备无患。
还有一点就是我想分享一些MongoDB的使用经验(这个日后等我整理好资料后再更新)
总结
码了这么多字,其实就是想说MongoDB很好用,但是不能对数据库太依靠太放心,它能为我们提供一些很不错的解决方案,但是我们必须在考虑使用它之前先做好任何它挂掉的准备,同样面对其他情况下也要有这种危机意识,数据库是不能尽信的,一场台风可能你的机房就没了,所以你要备份或者风险规避机制,应对突发的问题做好预案,保证程序系统安稳,这个才是重中之重!
最后欢迎大家指正我的错误观点,分享你的观点看法和经验,大家一起学习一起进步吧。