首先MongoDB是什么

区别于传统的关系型数据库(MySQL),MongoDB是NoSQL类型的数据库,是一个基于分布式【文件】存储的开源数据库系统。MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB文档类似于 JSON(BSON)对象。字段值可以包含其他文档,数组及文档数组。所有的数据对于MongoDB来说都是文档,不存在传统关系型数据的字段限制,这就意味这你同一个document中的每条数据可能字段都会不一样,非常灵活(维护困难)。


MongoDB的特点

  • 面向文件的
  • 高性能
  • 高可用性
  • 易扩展性
  • 丰富的查询语言

我们能用MongoDB做什么

由于MongoDB不支持事务,对数据一致性要求较高的业务(如银行业务,应用核心业务等)并不适用。对于其他个人网站(数据类型简单),日志分析类型业务(写入量大)等都和适合,甚至也可以把他当做缓存使用。


怎么用

要用好MongoDB,首先你应该忘记你学过的那些优雅无敌的SQL,忘记传统的范式化设计。 举个栗子: 一个业务场景是,保存图书馆内的所有书和其作者的相关信息。 在使用传统的范式化关系型数据设计中,我们可能会有1张book表和1张author表

#book:
{
    "_id" : ObjectId("5124b5d86041c7dca81917"),
    "title" : "如何使用MongoDB",
    "author" : [
        ObjectId("144b5d83041c7dca84416"),
        ObjectId("144b5d83041c7dca84418"),
    ]
}
#author:
{
    [
        "_id" : ObjectId("144b5d83041c7dca84416"),
        "name" : "张三",
        "age" : "30",
        "sex" : "male"
    ],
    [
        "_id" : ObjectId("144b5d83041c7dca84418"),
        "name" : "李四",
        "age" : "28",
        "sex" : "female"
    ],
    ...
}

这种设计的坏处是,查询时要join效率会比较差

如果是采用MongoDB来处理,完全可以这样:

{
    "_id" : ObjectId("5124b5d86041c7dca81917"),
    "title" : "如何使用MongoDB",
    "author" : [
        {
            "name" : "张三",
            "age" : "30",
            "sex" : "male"
        },
        {
            "name" : "李四",
            "age" : "28",
            "sex" : "female"
        },
    ]
}

这样通过这一个document就可以得到我们想要的信息。当然,任何事物都是有两面性的,如果遇到要更新author信息时,就要批量更新所有document对应的信息了,前面也提到过,不要盲目使用MongoDB,要针对自己所处的业务类型来选择。