• MongoDB_数据模型&数据类型(四)


    数据模块

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

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

    文档存储支持对结构化数据的访问,与关系模型不同的是,文档存储没有强制的架构。文档存储以封包键值对的方式进行存储,文档存储模型支持嵌套结构。例如,文档存储模型支持 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()
  • 相关阅读:
    ThreadSafety with the AutoResetEvent, ManualResetEvent Class(Synchronization of .net)
    使用Python SMTP发送邮件
    flask项目中设置logo
    如何解决Bootstrap中分页不能居中的问题
    pip install mysql_python报错解决办法
    git上拉项目
    AttributeError: 'str' object has no attribute 'decode'
    pycharm设置SDK
    为git创建远程仓库
    开发过程中git的使用
  • 原文地址:https://www.cnblogs.com/testlearn/p/15047501.html
Copyright © 2020-2023  润新知