作者:容易 2013-07-31 17:23:28
九、MDB的物理和逻辑结构
a)数据逻辑结构
1 mongoDB中的文档(document) 相当于 关系性数据库的一条一条的记录
2 collection 相当于关系性数据库中的表,所以一个collection中有多个document
3 多个集合在逻辑上组成一起 就是database
4 一个mongoDB 和 关系性数据库一样 可以有多个数据库(database)
与关系数据结构比较
MongoDB 关系性数据库
文档(document) 行(row)
集合(collection) 表(table)
Database Database
b)数据存储结构
MongoDB 默认的数据目录是data/db,它负责存储所有mongodb的数据文件,在mongoDB中每个数据库都包含一个.ns和一些数据文件,而且这些数据文件会随着数据的增多越来越多,则: 如果系统中有一个叫foo的数据库,那么构成foo这个数据库的文件就会有foo.ns ,foo.0,foo1,foo.2等。
Mongodb内部有预分配空间的机制,每个预分配的文件都用0填充,由于有了这个机制,
mongoDB始终保存额外的空间和空闲的文件,这对系统数据突然暴增时减缓磁盘压力有很大好处.
由于数据量的不断增加,mongoDB每新分配一次,大小都会是上一个文件大小的2倍,最大2G.这种机制保证系统数据较小时 不会浪费太多空间,系统数据较多时 也有相应预留空间。
c)mongoDB命名空间
每张表都有命名空间,每个索引也有对应的命名空间,这些命令空间的元数据都存在.ns文件中
在下图中,foo数据库包含3个文件存储数据与索引,foo.2文件属于预分配文件,foo.0和foo.1被分配到了相应的盘区对应不同的名字空间。
从上图可以看出,每个命名空间可以包含多个不同的盘区,这些盘区并不是连续的,与数据增长一样,每一个命名空间的盘区大小也随着分配的次数不断增长。在上图有个foo.$freelist命名空间,这个命名空间用于记录不再使用的盘区(如被删除的collection或索引),每当命名空间需要分配新的盘区时,就会检查.$freelist是否有合适大小的空间,这样就可以回收空闲的磁盘空间了。
d)MongoDB数据类型
MongoDB的文档使用BSON(BinaryJSON)来组织数据,BSON类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null、布尔、数字、字符串、数组及对象),不能完全满足复杂业务的需要,因此,BSON还提供了日期、32位数字、64位数字等类型,以下对MongoDB数据类型进行简要说明:
类型 描述
null 用于表示空值或者不存在的字段 {“x”,null}
布尔 ‘true’和’false’ {“x”,true}
32位整数 Shell中这个类型不可用,MongoDB在控制台使用JS引擎进行输入,而JS仅支持64位浮点数,所以32位整数将会被自动转义
64位整数 Shell中这个类型不可用, 64位整数与32位整数一样,在MongoDB控制台使用时,会转义成64位浮点数
64位浮点数 Shell中的数字都是这种类型,下面是浮点数{“x”:3.14}、{“x”:3}
字符串 UTF-8字符串都可表示为字符串类型的数据{“x”:”foobar”}
符号 Shell不支持这种类型,将自动转义成字符串
对象ID 对象id是文档的12字节的唯一ID,时间戳|机器|PID|计数器{“x”:ObjectId()}
日期 日期类型存储的是从标准纪元开始的毫秒数{“x”:new Date()}
正则表达式 文档中可以包含正则表达式,其正则表达式采用JS语法来表示{“x”:/foobar/i}
代码 文档中可以包含js代码{“x”:function(){…}}
二进制数据 二进制数据可以由任意字节的串组成,不过Shell无法使用
最大值 BSON包括一个特殊类型,表示可能的最大值Shell无法使用
最小值 BSON包括一个特殊类型,表示可能的最小值Shell无法使用
未定义 文档中也可以使用未定义类型{“x”:undefined}
数组 值的集合或者列表可以表示成数组{“x”:[“a”,”b”,”c”]}
内嵌文档 文档可以包含别的文档{“x”:{“foo”:”bar”}}
One Response