前言

简单介绍一下文档数据库。

正文

mongodb 是一个以json为数据模型的文档数据库。

这里要介绍一下什么是json。因为有些人认为'{a:1,b:2}' 是json,而"this is a" 不是json。

然证明这的确是一个json。事实证明数组也是。

所以不能把json想的过于狭义。

可以看下百度百科:

https://baike.baidu.com/item/JSON/2462549?fr=aladdin

那么什么是文档数据库?

从1989年起,Lotus通过其群件产品Notes提出了数据库技术的全新概念-"文档数据库",文档数据库区别于传统的其它数据库,它是用来管理文档。在传统的数据库中,信息被分割成离散的数据段,而在文档数据库中,文档是处理信息的基本单位。一文档可以很长、很复杂、可以无结构,与字处理文档类似。一个文档相当于关系数据库中的一条记录。

因为mongodb 是文档数据库,且是以json为数据模型的,那么可以想想,mongdb的最小单位就是一个文档,也就是mongodb里面的一条记录或者说一个json。

我们知道mongodb是开源的,为什么开源呢? 其实这就是一种新的市场模式,而不仅仅说互联网时代开源style,要知道天下没有免费的午餐。

mongodb 是 mongodbBD Inc的上市公司开发的,提供mongodb服务的。有人会想mongodb 开源了,别人不就免费了吗?这不得亏本,还能搞上市。

要知道一个公司如果使用mongodb到达一定的时候,是要有方案才能维护用户,这就是mongodb Inc的业务,业务才是赚钱的。开源并不会影响该公司的收入,同样的还多了这么多测试实例,所以不用想到别人开源免费让你使用,就好像占了多大便宜一样。

mongodb 有两个版本,一个是社区版一个是企业版。社区版基于SSPL,一种和AGPL基本类似的开源协议,企业版是基于商业协议,需要付费的。

使用用给产品,那么需要知道其中的历史。

  1. 0.x 2008 可以说是mongdb的诞生,可以用来存储然后读取。

  2. 1.x 2010 提供了复制集和分片集,这个时候提供高可用了。

  3. 2.x 更丰富的数据库功能,以前几乎只是单纯的读取和写入,跟丰富的数据库就加入了很多功能,如聚合等。

  4. 3.x 收购WiredTiger 和发展周边生态环境,这个时候mongodb才走向成熟了。 因为当时mongodb 没有数据引擎,也就是有了带有芯片的发动机,这个时候mongodb 很多提的bug,或者速度问题得到解决了。

所以市场上大多数应该是3.x以上的,毕竟没有芯片的发动机还是相当危险的。

  1. 4.x 2018 分布式事务支持,所以要想使用事务,那么需要使用4 以上的版本。

现在很多公司开始使用mongodb了,为什么要使用呢? 其优势是什么。

说一下个人使用情况,因为微服务的使用,说一说mongodb相比其他数据库的好像。

微服务讲究一个服务自治的概念,也就是说每一个服务其实都是有一个数据库的。

那么这个时候就面临选择了,选择关系型数据库还是非关系型数据库了。

这个时候应该大部分时候会使用非关系型数据库,为什么这么说呢?

因为微服务的服务自治,该服务一般设计的业务比较简单。

比如一个account服务,里面有用户信息,用户的团队信息,用户的等级信息。他们都是信息,但是他们之间没有什么联系,其实也就是记录,故而非关系数据库好些,这样设计模型也简单一些。

然后还有一个就是比如说account 服务存储用户信息,那一条用户信息里面增加了一个字段,那么其实是可以之间在代码中增加该字段的写入,而不需去增加一个像关系数据库里面一样去改变表的结构。

我们知道如果去修改表的结构的话,还是一个风险高的事件,不是说增加字段这个操作有多危险,而是增加字段的时候,其实会修改每一条记录的数据,如果遇到庞大的数据体,还是会影响到线上的,mongodb 对此还是非常灵活的。

可以看到mongodb 非常灵活,因为mongodb 太灵活了,那么太灵活的东西也有不好的问题,那就是比如我们sex这个字段,要不是男要不是女,那么不得对其进行约束?

事实上mongodb也提供了jsonSchema这个东西来进行约束了。https://www.docs4dev.com/docs/zh/mongodb/v3.6/reference/reference-operator-query-jsonSchema.html

这东西不一定要用,如果我们在应用层面没问题的话,其实是不需要的。

mongodb 使用过程还发现其一个设计特点,比如说有一个网关api的权限表设计:

{

userId:"xxx",

permission:[// 相关权限]

}

以我们的关系模型设计呢,这个permission可能就是一张表了,而在此,只是一个属性。

又比如说用户设置密码找回3个问题:

{

userid:"",

questions:[

{

'question':'xxx',

'answers':'xxx'

},

....

]

}

这条记录就可以覆盖一个场景。

这些都是简单的场景,如果复杂的场景,那么在关系数据库中你需要建立的表就更多了,那么表与表之间连接查询,效率可想而知。

mongodb 能够通过简单的设计就能够覆盖一些复杂的业务模型了,这样在代码层面上也就简单了很多了。

就像前面说的,几张表的联合查询,一张表一次行记录即可查出,那么代码的设计也很简单,代码越简单,那么维护性也就好。初学者可能觉得代码看起来越牛逼越好,其实大道至简。

除了有些业务使用mongodb能得到设计上的简化外,还有一些也需要用到。

比如说,数据行业,需要大量快速的存储,mongodb的存储是非常快的,结构也灵活。

还有一个特点就是高可用和横向扩展能力。

比如说mysql,如果数据达到1个亿,那么是会出现不流畅的,这个时候就需要重新设计和各种优化了。但是mongodb,如果达到一个亿,那么只需要使用mongodb的横向扩展能力,对于mongodb而言,这一切才刚刚开始,其定位是TB-PB级的。

当然这是数据行业很容易遇到的场景,其他的可能没有这么快达到一个亿数据。mongodb的横向扩展和高可用方案还是可以的。

下一节正式开始。

mongodb基础整理篇————简单介绍[一]的更多相关文章

  1. mongodb基础整理篇————常规操作[二]

    前言 简单整理一下常规操作. 正文 虽然一般说写代码看的是思想,但是呢,如果不知道mongodb 有哪些常用的操作,那么你怎么能知道mongodb是否符合你的需求,比如说如果聚合功能都没有,你得自己写 ...

  2. mongodb基础整理篇————副本概念篇[外篇]

    前言 副本集整理. 开始逐步把mongodb博客补齐了. 正文 什么是副本集 副本集是一组服务器,其中一个是用于处理写入操作的主节点,还有多个用于保存主节点的数据副本的从节点. 如果主节点崩溃了,则从 ...

  3. iOS开发网络篇—简单介绍ASI框架的使用

    iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 ...

  4. iOS开发UI篇—简单介绍静态单元格的使用

    iOS开发UI篇—简单介绍静态单元格的使用 一.实现效果与说明 说明:观察上面的展示效果,可以发现整个界面是由一个tableview来展示的,上面的数据都是固定的,且几乎不会改变. 要完成上面的效果, ...

  5. iOS开发Swift篇—简单介绍

    iOS开发Swift篇—简单介绍 一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为“雨燕”,是它的LOGO 是一只燕子,跟Objective-C ...

  6. 【音视频连载-001】基础学习篇- SDL 介绍以及工程配置

    技术开发故事会连载 这是音视频基础学习系列的第一篇文章,主要讲解 SDL 是什么以及为什么要用到它,看似和音视频没啥卵关系,其实必不可少. SDL 简介 SDL 是 "Simple Dire ...

  7. MongoDB基础一篇就够了

    MongoDB linux安装MongoDB Windows安装MongoDB 查看当前数据库名称 db 查看所有数据库名称 列出所有在物理上存在的数据库 show dbs 切换数据库 如果数据库不存 ...

  8. Java提高篇—— 简单介绍Java 的内存泄漏

    java最明显的一个优势就是它的内存管理机制.你只需简单创建对象,java的垃圾回收机制负责分配和释放内存.然而情况并不像想像的那么简单,因为在Java应用中经常发生内存泄漏. 本教程演示了什么是内存 ...

  9. iOS开发Swift篇—(一)简单介绍

    iOS开发Swift篇—简单介绍 一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为“雨燕”,是它的LOGO 是一只燕子,跟Objective-C ...

随机推荐

  1. 《手把手教你》系列技巧篇(五十)-java+ selenium自动化测试-字符串操作-上篇(详解教程)

    1.简介 自动化测试中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥这里介绍两种 ...

  2. 为什么Redis集群有16384个槽

    一.前言 我在<那些年用过的Redis集群架构(含面试解析)>一文里提到过,现在redis集群架构,redis cluster用的会比较多. 如下图所示 对于客户端请求的key,根据公式H ...

  3. Python绘制面积图

    一.Python绘制面积图对应代码如下图所示 import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans ...

  4. 【js基础】基础数据类型变量为啥有属性?

    1.变量和数值 let a =1 这是一个简单的变量声明,其中"a"是变量,在代码中供程序员或者语法操作的,而1是数值,是我最终需要的东西.为什么不直接使用数值而使用变量?这个就不 ...

  5. 转:Sed使用

    awk于1977年出生,今年36岁本命年,sed比awk大2-3岁,awk就像林妹妹,sed就是宝玉哥哥了.所以 林妹妹跳了个Topless,他的哥哥sed坐不住了,也一定要出来抖一抖. sed全名叫 ...

  6. PHP安装sqlsrv扩展( Centos系统、或宝塔面板)

    最近新安装了一台Centos服务器, 由于软件使用PHP + sqlserver , 因此需要给PHP安装一个sqlsrv扩展, 虽然这个扩展自己也安装过很多次了,但是从来都没有记录下来过,导致偶尔还 ...

  7. Django modules模块

    http://www.cnblogs.com/wupeiqi/articles/5246483.html

  8. jackson-databind-2.2.3.jar,ackson-annotations-2.2.3.jar和jackson-core-2.2.3.jar下载

    jackson包开发下载,包括如下3个jar文件 jackson-databind-2.2.3.jar,还需要jackson-annotations-2.2.3.jar和jackson-core-2. ...

  9. IDEA中SpringBoot启动报错Error:(11, 39) java: 找不到符号

    确保不是依赖没有导入或者编码不对问题后 如果还是不行 可以试试以下方式 解决办法 将图片框中Delegate IDE build 勾选 然后重新启动即可

  10. c++之升序和降序排序

    1.头文件 #include <functional> 2. 降序 // 期末成绩 int score[] = {99, 77, 30, 80}; // 1. 降序排列 std::sort ...