本节书摘来异步社区《大数据存储:MongoDB实战指南》一书中的第1章,第1.6节,作者: 郭远威 , 彭文波 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.6 MongoDB特点
大数据存储:MongoDB实战指南
它的存储模型与关系数据库的比较如表1-1所示。
关系数据库中最基本的单元是行,而MongoDB中最基本存储单元是document,典型结构如下所示。
{
"_id" : ObjectId("51e0c391820fdb628ad4635a"),
"author" : { "name" : "Jordan","email" : "Jordan@123.com" },
"postcontent" : "jordan is the god of basketball",
"comments" : [
{"user" : "xiaoming", "text" : "great player"},
{ "user" : "xiaoliang", "text" : "nice action" }
]
}
它用与JSON格式类似的键值对来存储(在MongoDB中叫BSON对象),其中值的数据类型有常见的字符串、数字、日期,还可以是BSON对象、数组以及数组的元素,也可以是BSON对象,通过这种嵌套的方式,使MongoDB的数据类型变得相当丰富。
MongoDB与传统关系数据库还有一个重大区别就是:可扩展的表结构。也就是说collection(表)中的document(一行记录)所拥有的字段(列)是可以变化的,下面文档对象document(一行记录)比上面列出的文档对象document(一行记录)多一个time字段,但它们可以共存在同一个collection(表)中。
{
"_id" : ObjectId("51e0c391820fdb628ad4635a"),
"author" : { "name" : "Jordan","email" : "Jordan@123.com" },
"postcontent" : "jordan is the god of basketball",
"comments" : [
{"user" : "xiaoming", "text" : "great player"},
{ "user" : "xiaoliang", "text" : "nice action" }
],
"time": "2013-07-13"
}
MongoDB查询语句不是按照SQL的标准来开发的,它围绕JSON这种特殊格式的文档型存储模型开发了一套自己的查询体系,这就是现在非常流行的NoSQL体系。关系数据库中常用的SQL语句在MongoDB中都有对应的解决方案。当然也有例外,MongoDB不支持JOIN语句。我们知道传统关系数据库中JOIN操作可能会产生笛卡尔积的虚拟表,消耗较多系统资源,而MongoDB的文档对象集合collection可以是任何结构,我们可以通过设计较好的数据模型尽量避开这样的操作需求。如果真的需要从多个collection(表)中检索数据,那我们可以通过多次查询得到。
在关系数据库中经常用到的group by等分组聚集函数,在MongoDB中也有,而且MongoDB提供了更加强大的MapReduce方案(GOOGLE提出的并行编程),为海量数据的统计、分析提供了便利。
MongoDB支持日志功能Journaling,对数据库的增、删、改操作会记录在日志文件中。MongoDB每100ms将内存中的数据刷到磁盘上,如果意外停机,在数据库重新启动时,MongoDB能通过Journaling日志功能恢复。
MongoDB支持复制集(Replset),一个复制集在生产环境中最少需要3台独立的机器(测试的时候为了方便可能都部署在一台机器上),一台作主节点(primary),一台作次节点(secondary),一台作仲裁节点(只负责选出主节点),备份、自动故障转移,这些特性都是复制集支持的。
MongoDB支持自动分片Sharding,分片的功能实现海量数据的分布式存储,分片通常与复制集配合起来使用,实现读写分离、负载均衡,当然如何选择片键是实现分片功能的关键。如何实现读写分离我们后面会详细分析。
总之,MongoDB最吸引人的地方应该就是自由的表结构、MapReduce、分片、复制集,通过这些功能实现海量数据的存储、高效地读写以及数据的分析。