数据模块

传统的关系型数据库需要对表结构进行预先定义和严格的要求,而这样的严格要求,导致了处理数据的过程更加烦琐,甚至降低了执行效率。

在数据量达到一定规模的情况下,传统关系型数据库反应迟钝,想解决这个问题就需要反其道而行之,尽可能去掉传统关系型数据库的各种规范约束,甚至事先无须定义数据存储结构。

文档存储支持对结构化数据的访问,与关系模型不同的是,文档存储没有强制的架构。文档存储以封包键值对的方式进行存储,文档存储模型支持嵌套结构。例如,文档存储模型支持 XML  和 JSON 文档,字段的“值”可以嵌套存储其他文档,也可存储数组等复杂数据类型。

MongoDB 存储的数据类型为 BSON,BSON 与 JSON 比较相似,文档存储模型也支持数组和键值对。

MongoDB 的文档数据模型如图下所示,MongoDB 的存储逻辑结构为文档,文档中采用键值对结构,文档中的 _id 为主键,默认创建主键索引。从 MongoDB 的逻辑结构可以看出,MongoDB 的相关操作大多通过指定键完成对值的操作。

文档数据库无须事先定义数据存储结构,这与键值数据库和列族数据库类似,只需在存储时采用指定的文档结构即可。从上图可以看出,一个大括号{}中包含了若干个键值对,大括号{}中的内容就被称为一条文档。

BSON对JSON做了哪些改进?

上面提到了MongoDB 存储的数据类型为 BSON,一种基于 JSON 的二进制序列化格式,用于 MongoDB 存储文档并进行远程过程调用。

JSON 是一种网络常用的数据格式,具有自描述性。JSON 的数据表示方式易于解析,但支持的数据类型有限。BSON 目前主要用于 MongoDB 中,选择 JSON 进行改造的原因主要是 JSON 的通用性及 JSON 的 schemaless 的特性。

BSON 改进的主要特性有下面三点。

更快的遍历速度

BSON 对 JSON 的一个主要的改进是,在 BSON 元素的头部有一个区域用来存储元素的长度, 当遍历时,如果想跳过某个文档进行读取,就可以先读取存储在 BSON 元素头部的元素的长度, 直接 seek 到指定的点上就完成了文档的跳过。

在 JSON 中,要跳过一个文档进行数据读取,需要在对此文档进行扫描的同时匹配数据结构才可以完成跳过操作。

操作更简易

如果要修改 JSON 中的一个值,如将 9 修改为 10,这实际是将一个字符变成了两个,会导致其后面的所有内容都向后移一位。
在 BSON 中,可以指定这个列为整型,那么,当将 9 修正为 10 时,只是在整型范围内将数字进行修改,数据总长不会变化。

需要注意的是:如果数字从整型增大到长整型,还是会导致数据总长增加。

支持更多的数据类型

BSON 在 JSON 的基础上增加了很多额外的类型,BSON 增加了“byte array”数据类型。这使得二进制的存储不再需要先进行 base64 转换再存为 JSON,减少了计算开销

BSON 支持的数据类型如表所示。

BSON 支持的数据类型
类型 描述示例
NULL 表示空值或者不存在的字段,{"x" : null}
Boolean 布尔型有 true 和 false,{"x" : true}
Number 数值:客户端默认使用 64 位浮点型数值。{"x" : 3.14} 或 {"x" : 3}。对于整型值,包括 NumberInt(4 字节符号整数)或 NumberLong(8 字节符号整数),用户可以指定数值类型,{"x" : NumberInt("3")}
String 字符串:BSON 字符串是 UTF-8,{"x" : "中文"}
Regular Expression 正则表达式:语法与 JavaScript 的正则表达式相同,{"x" : /[cba]/}
Array 数组:使用“[]”表示,{"x" : ["a", "b", "c"]}
Object 内嵌文档:文档的值是嵌套文档,{"a" : {"b" : 3}}
ObjectId 对象 id:对象 id 是一个 12 字节的字符串,是文档的唯一标识,{"x" : objectId()}
BinaryData 二进制数据:二进制数据是一个任意字节的字符串。它不能直接在 Shell 中使用。如果要将非 UTF-8 字符保存到数据库中,二进制数据是唯一的方式
JavaScript 代码:查询和文档中可以包括任何 JavaScript 代码,{"x" : function(){/*...*/}}
Data 日期:{"x" : new Date()}
Timestamp 时间戳:var a = new Timestamp()

MongoDB_数据模型&数据类型(四)的更多相关文章

  1. Day1---Java 基本数据类型 - 四类八种 --九五小庞

    一.Java四大数据类型分类 1.整型 byte .short .int .long 2.浮点型 float . double 3.字符型 char 4.布尔型 boolean 二.八种基本数据类型 ...

  2. js检测数据类型四种办法

    面试题中经常会考js数据类型检测,今天我来分享一下js中常用的四种方法判断数据类型,欢迎指点更正. 废话不多说,直入正题. 1.typeof console.log(typeof "&quo ...

  3. web工程设计<mysql数据模型-数据类型的优化>

    Schema与数据类型优化 良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计schema,这往往需要权衡各种因素. 一:选择优化的数据类型 ①:更小的通常更好 整数类型:M ...

  4. java的基本数据类型--四类八种

    java的数据类型 1.分为基本数据类型和引用数据类型 基本数据类型的分类:整数型: byte  占用一个字节 范围-128-127 short 占用两个字节  -2^15~2^15-1 int    ...

  5. python基础(9):基本数据类型四(set集合)、基础数据类型补充、深浅拷贝

    1. 基础数据类型补充 li = ["李嘉诚", "麻花藤", "⻩海峰", "刘嘉玲"] s = "_&qu ...

  6. Python基础数据类型(四) tuple元祖

    元祖tuple(,) 元祖就是不可变的列表 元祖用()表示,元素与元素之间用逗号隔开,数据类型没有限制 tu = ('科比','詹姆斯','乔丹') tu = tuple('123') 小括号中 有一 ...

  7. Py西游攻关之基础数据类型(四)-字典

    Py西游攻关之基础数据类型 - Yuan先生 https://www.cnblogs.com/yuanchenqi/articles/5782764.html 七 Dictionary(字典) 字典是 ...

  8. flask建立数据模型数据类型

    https://blog.csdn.net/happyanger6/article/details/53947162 https://blog.csdn.net/happyanger6/article ...

  9. 6、数据类型四:sets

    集合的基本特征:无序,唯一. 一个redis集合最多能存放232-1个集合元素.其强大之处在于它支持集合的“交.差.并”运算,而且能够快速的判断某个给定值是否在集合中. 1.基本命令: SADD ke ...

随机推荐

  1. 【Python】CV2的一些基本操作

    ·导入: import cv2 ·读取图片: img = cv2.imread('路径') 使用函数cv2.imread(filepath,flags)读入一副图片 filepath:要读入图片的完整 ...

  2. 关于tensorflow无法使用gpu

    python3.6 无法使用tensorflow gpu 环境名称 test1 在控制台里进入环境 conda activate test1 使用python python 查看gpu能否使用 pri ...

  3. C语言static关键字

    C语言static关键字 static关键字的作用,主要从在程序的生存周期.作用域和在代码段中的位置起作用. 全局变量 静态全局变量 局部变量 静态局部量 生存周期 程序运行到结束 程序运行到结束 函 ...

  4. 4个优化方法,让你能了解join计算过程更透彻

    摘要:现如今, 跨源计算的场景越来越多, 数据计算不再单纯局限于单方,而可能来自不同的数据合作方进行联合计算. 本文分享自华为云社区<如何高可靠.高性能地优化join计算过程?4个优化让你掌握其 ...

  5. HCL华三模拟器静态路由实验

    (copy自我的其他博客网站) 拓扑如下: 实验目的:通过给A.B.C三台路由器配置静态路由,使PC1可以ping通PC2. 实验环境:Windows10 (21H1),HCL(V3.0.1) 实验步 ...

  6. shell脚本 监控网卡信息

    一.简介 源码地址 日期:2018/6/22 介绍:显示实时输入输出流量 效果图: 二.使用 适用:centos6+ 语言:英文 注意:无 下载 wget https://raw.githubuser ...

  7. Django中的常用字段类型与参数

    Django中的常用字段类型 1. 数值型 以下都是数值相关的,比如AutoField,它在MySQL中的类型为int(11),而BooleanField在MySQL中对应的类型是tinyint(1) ...

  8. CF975A Aramic script 题解

    Content 定义一个字符串的根为字符串中不同种类的字符按字典序非降序排列得到的字符串.例如 \(\texttt{aaa}\) 的词根为 \(\texttt{a}\),\(\texttt{babb} ...

  9. LuoguB2075 幂的末尾 题解

    Content 求 \(a^b\) 的末三位. 数据范围:\(1\leqslant a\leqslant 100\),\(1\leqslant b\leqslant 10^4\). Solution ...

  10. IDEA设置默认(指定)的注释作者信息

    有时候我们想在IDEA里面创建的时候就默认设置一个指定的作者信息 填入作者信息 然后点击ok /** * * @author yvioo */ 然后我们新建文件的时候就会自动带上这个了,模板可以根据自 ...