数据库-mongoDB

MongoDB是一种面向文档的数据库管理系统,由C++撰写而成,
MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业、各个行业以及各类应用程序的开源数据库。作为一个适用于敏捷开发的数据库,MongoDB的数据模式可以随着应用程序的发展而灵活地更新。

MongoDB是专为可扩展性,高性能和高可用性而设计的数据库。它可以从单服务器部署扩展到大型、复杂的多数据中心架构。利用内存计算的优势,MongoDB能够提供高性能的数据读写操作。 MongoDB的本地复制和自动故障转移功能使您的应用程序具有企业级的可靠性和操作灵活性。

df597eeb.png

MongoDB的逻辑结构是一种层次结构,主要由:文档(document)、集合(collection)、数据库(database)这三部分组成的。

文档:是由键值对组成,相当于数据库中的一行数据
集合: 多条记录,数据库中的表
数据库: 多个集合

里边可以存的数据类型:
类型|说明
–|–
null| null用于表示空值或者不存在的字段。 {"x":null}
布尔 | 布尔类型有两个值’true’和’false1’. {"X":true}
32位整数| 类型不可用。JavaScript仅支持64位浮点数,所以32位整数会被自动转换。
64位整数| 不支持这个类型。shell会使用一个特殊的内嵌文档来显示64位整数,
64位浮点数 | shell中的数字都是这种类型。下面的表示都是浮点数: {"X" : 3.1415926} {"X" : 3}
字符串 | UTF-8字符串都可表示为字符串类型的数据: {"x" : "foobar"}
符号| 不支持这种类型。shell将数据库里的符号类型转换成字符串。
对象id| 对象id是文档的12字节的唯一 ID, {"X" :ObjectId() }
日期 | 日期类型存储的是从标准纪元开始的毫秒数。不存储时区: {"X" : new Date()}
正则表达式| 文档中可以包含正则表达式,采用JavaScript的正则表达式语法: {"x" : /foobar/i}
代码 | 文档中还可以包含JavaScript代码:{"x" : function() { /* …… */ }}
二进制数据 | 二进制数据可以由任意字节的串组成。不过shell中无法使用。
最大值| BSON包括一个特殊类型,表示可能的最大值。shell中没有这个类型。
最小值 | BSON包括一个特殊类型,表示可能的最小值。shell中没有这个类型。
未定义 | 文档中也可以使用未定义类型: {"x":undefined}
数组 | 值的集合或者列表可以表示成数组:{"x" : ["a", "b", "c"]}
内嵌文档 | 文档可以包含别的文档,也可以作为值嵌入到父文档中,数据可以组织得更自然些,不用非得存成扁平结构的:{"x" : {"food" : "noodle"}}

应用场景

  1. 网站数据:mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
  2. 缓存:由于性能很高,mongo也适合作为信息基础设施的缓存层。在系统重启之后,由mongo搭建的持久化缓存可以避免下层的数据源过载。
  3. 大尺寸、低价值的数据:使用传统的关系数据库存储一些数据时可能会比较贵,在此之前,很多程序员往往会选择传统的文件进行存储。
  4. 高伸缩性的场景:mongo非常适合由数十或者数百台服务器组成的数据库。
  5. 用于对象及JSON数据的存储:mongo的BSON数据格式非常适合文档格式化的存储及查询。
应用特征 Yes / No
应用不需要事务及复杂 join 支持 必须 Yes
新应用,需求会变,数据模型无法确定,想快速迭代开发
应用需要2000-3000以上的读写QPS(更高也可以)
应用需要TB甚至 PB 级别数据存储 ?
应用发展迅速,需要能快速水平扩展 ?
应用要求存储的数据不丢失 ?
应用需要99.999%高可用 ?
应用需要大量的地理位置查询、文本查询

如果上述有1个 Yes,可以考虑 MongoDB,2个及以上的 Yes,选择MongoDB绝不会后悔。

8034471f.png

不适用的场景

  1. 高度事物性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
  2. 传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
  3. 需要SQL的问题。

缺点

缺点:

  1. 不支持事务
  2. 不支持join、复杂查询