下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

MongoDB体系结构

作者:课课家教育     来源: http://www.kokojia.com点击数:1503发布时间: 2017-08-07 10:00:08

标签: 数据库MongoDB体系结构

  凡是涉及到内部结构方面的内容,都比较抽象,但是事物的结构往往决定事物的性质,要想更本质的认识mongodb,那就得慢慢来!

  MongoDB是一个可移植的数据库,它在流行的每一个平台上都可以使用,即所谓的跨平台特性。

  一个运行着的MongoDB数据库就可以看成是一个MongoDBServer,该Server由实例和数据库组成,在一般的情况下一个MongoDBServer机器上包含一个实例和多个与之对应的数据库,但是在特殊情况下,如硬件投入成本有限或特殊的应用需求,也允许一个Server机器上可以有多个实例和多个数据库。

  MongoDB中一系列物理文件(数据文件,日志文件等)的集合或与之对应的逻辑结构(集合,文档等)被称为数据库,简单的说,就是数据库是由一系列与磁盘有关系的物理文件的组成。

  体系结构具体分为:逻辑结构和存储结构。

  逻辑结构不难理解。

  MongoDB的逻辑结构是一种层次结构。主要由:文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面向用户的,用户使用MongoDB开发应用程序使用的就是逻辑结构。

  MongoDB的文档(document),相当于关系数据库中的一行记录。

  多个文档组成一个集合(collection),相当于关系数据库的表。

  多个集合(collection),逻辑上组织在一起,就是数据库(database)。

  一个MongoDB实例支持多个数据库(database)。

  一张非常形象的mongodb与关系型数据库对比表:

一张非常形象的mongodb与关系型数据库对比

  存储结构,这部分既是重点也是难点,因为很抽象!

  MongoDB的默认数据目录是/usr/local/mongodb/data,它负责存储所有的MongoDB的数据文件。在MongoDB内部,每个数据库都包含一个.ns文件和一些数据文件,而且这些数据文件会随着数据量的增加而变得越来越多。所以如果系统中有一个叫做foo的数据库,那么构成foo这个数据库的文件就会由foo.ns,foo.0,foo.1,foo.2。大家可以打开自己安装mongodb时的数据库文件夹,里头就是这些文件,新建一个数据库,就会产生相应的一组以数据库命名的数据文件,并且本人也动手试过,foo.2大小是foo.1的两倍,foo.1大小是foo.0的两倍。

  MongoDB内部有预分配空间的机制,每个预分配的文件都用0进行填充,由于有了这个机制,MongoDB始终保持额外的空间和空余的数据文件,从而有效避免了由于数据暴增而带来的磁盘压力过大的问题。

  由于表中数据量的增加,数据文件每新分配一次,它的大小都会是上一个数据文件大小的2倍,每个数据文件最大2G。这样的机制有利于防止较小的数据库浪费过多的磁盘空间,同时又能保证较大的数据库有相应的预留空间使用。

  数据库的每张表都对应一个命名空间,每个索引也有对应的命名空间。这些命名空间的元数据都集中在*.ns文件中。

  在下图中,foo这个数据库包含3个文件用于存储表和索引数据,foo.2文件属于预分配的空文件。foo.0和foo.1这两个数据文件被分为了相应的盘区对应不同的名字空间。

数据库的每张表都对应一个命名空间,每个索引也有对应的命名空间。这些命名空间的元数据都集中在*.ns文件中。    在下图中,foo这个数据库包含3个文件用于存储表和索引数据,foo.2文件属于预分配的空文件。foo.0和foo.1这两个数据文件被分为了相应的盘区对应不同的名字空间。

  上图显示了命名空间和盘区的关系。每个命名空间可以包含多个不同的盘区,这些盘区并不是连续的。与数据文件的增长相同,每一个命名空间对应的盘区大小的也是随着分配的次数不断增长的。这样做的目的是为了平衡命名空间浪费的空间与保持某一个命名空间中数据的连续性。上图中还有一个需要注意的命名空间:$freelist,这个命名空间用于记录不再使用的盘区(被删除的Collection或索引)。每当命名空间需要分配新的盘区的时候,都会先查看$freelist是否有大小合适的盘区可以使用,这样就回收空闲的磁盘空间。

  如果看完上文后大家还是无法理解透彻的话,下面呢我们通过对mongoDB的CRUD操作,借助可视化工具mongoVUE来看一下mongoDB中的结构,相信一定会对理解这些基本概念有更形象的认识。

  通过shell命令来执行数据库的CRUD操作:执行mongo命令启动客户端

 如果看完上文后大家还是无法理解透彻的话,下面呢我们通过对mongoDB的CRUD操作,借助可视化工具mongoVUE来看一下mongoDB中的结构,相信一定会对理解这些基本概念有更形象的认识。    通过shell命令来执行数据库的CRUD操作:执行mongo命令启动客户端

  启动shell时,默认连接本地的test数据库,并将该数据库的连接保存到db变量中。db.user.insert(userDoc)中,user表示数据库中的集合名,不需要提前定义,可以在插入时创建。

  看一下mongoVUE中更形象的图片吧:

  启动shell时,默认连接本地的test数据库,并将该数据库的连接保存到db变量中。db.user.insert(userDoc)中,user表示数据库中的集合名,不需要提前定义,可以在插入时创建。    看一下mongoVUE中更形象的图片吧:

  启动shell时,默认连接本地的test数据库,并将该数据库的连接保存到db变量中。db.user.insert(userDoc)中,user表示数据库中的集合名,不需要提前定义,可以在插入时创建。    看一下mongoVUE中更形象的图片吧:

  启动shell时,默认连接本地的test数据库,并将该数据库的连接保存到db变量中。db.user.insert(userDoc)中,user表示数据库中的集合名,不需要提前定义,可以在插入时创建。    看一下mongoVUE中更形象的图片吧:

  启动shell时,默认连接本地的test数据库,并将该数据库的连接保存到db变量中。db.user.insert(userDoc)中,user表示数据库中的集合名,不需要提前定义,可以在插入时创建。    看一下mongoVUE中更形象的图片吧:

  从上图中可以看到,admin、local、test是mongoDB提供的三个db,当然,我们可以创建自己的数据库。

  Collections:在mongoDB中叫做集合,是文档的集合。它是无模式的,可以存储各种各样的文档。在图中,user就是一个集合。看上去有点像关系型数据库中的表。

  和关系型数据库中的表相比,关系数据库的每一张表就是一个关系模型的映射,每张表的字段就是对应实体的属性和主外键的集合,每个字段需要提前定义。

  而集合中可以保存毫无关系的数据,而且具体要保存什么不需要提前定义。

  Document:这里的user集合中有两个document。文档是mongoDB保存数据的基本单元。数据的存储结构为BSON格式,也就是TextView中显示的文本。

  保存的数据类型可以为:null、boolean、String、object、32位整数、64位整数、64位浮点数、日期、正则表达式、js代码、二进制数据、数组、内嵌文档、最大值、最小值、未定义类型。

  GridFS:由于BSON对象有大小限制,不适合存储大型文件,GridFS文件系统为大型文件提供了存储方案(其存储原理稍后再讲)。fs中保存的是图片、视频等大文件。

  从图上我们可以看到集合中的每个文档都自动增加了一个_id,而每个图片则新增了多个键:_id,chunkSize,md5、length、aliases等,这些属性都不是我上传时添加的,而是系统自动保存的,这就涉及到了GridFS处理大文件的机制。

  小编结语:

  更多内容尽在课课家教育!

赞(12)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程