BSON¶
BSON 是 MongoDB 文档的存储格式。
和 Json 一样, BSON 也是一种 schema-less 的序列化格式。 如果不追求数据的可阅读性, 还喜欢 Json 的灵活, bson 可以作为一个候选。 另外 bson 修改成本小,比 Json 效率高,扩充了 Json 类型, 支持 DateType、BinData 等。
BSON 协议比较简单。见 http://bsonspec.org/spec.html 。
基础类型¶
BSON 基础类型都是固定长度。
类型 | 占用空间 |
---|---|
byte | 1 byte (8-bits) |
int32 | 4 bytes (32-bit 有符号整型、补码) |
int64 | 8 bytes (64-bit 有符号整型、补码) |
uint64 | 8 bytes (64-bit 无符号整型) |
double | 8 bytes (64-bit IEEE 754-2008 浮点数) |
decimal128 | 16 bytes (128-bit IEEE 754-2008 十进制浮点) |
变长类型¶
- string: 变长类型和 protobuf 差不多, 普遍采用
length+data
的方式编码 - cstring: cstring 是 c 风格字符串, 约定以 0 作为字符串结尾, 不需要长度字段。
- binary: 二进制数据。 编码方式为
length(int32) subType(byte) data
总结¶
从功能上来说,bson 是json 的扩充。
反序列化效率高
由于基础类型直接是二进制存储,反序列化效率比json高很多。
从存储空间来说, BSON 并不见得比 Json 好
对于字符串类型,json需要额外耗费两个双引号, 而 BSON 也需要额外两字节指定长度和结束字符。
最常用的数值类型 int32 在 bson 中固定耗费 4 字节, 而通常情况下, 小数值(如 1、2)在 json 中只需要存储1字节,甚至 1000 以内的整数也只需要3字节。
对于数组, BSON 内部存储为
{0: xx, 1: xx, 2: xx}
, 这也是 BSON 一个值得吐槽的地方。
修改成本很低
BSON 并不属于紧凑类型格式,但固定长度的基础类型带来的好处是修改成本极小。
考虑一个小数字如 1,在 json 字符串中虽然只占用1字节,如果运行期需要修改为 10, 则需要把这个字段后面所有内容都往后移动1位,才能擦除原有值写入 10。
而BSON中是固定长度, 就不会有这种问题,非常适合做修改。
这也是 MongoDB 使用 BSON 的原因, 这个优势是其他序列化方法无法比拟的。
BSON 反序列化快、修改成本小,面向存储的优势极大。