SequoiaDB 巨杉資料庫存儲的記錄( Record )也稱為文檔( Document ) 。文檔在分布式存儲引擎中,以 BSON 的方式存儲,而 BSON 是 JSON 資料模型的二進制編碼。由于文檔是一種基于 JSON 資料模型的靈活鍵值對,而且它支援嵌套結構與數組,是以它既可以存儲關系型資料,也可以存儲半結構化和非結構化資料。
文檔概念
文檔的字面形式如同 JSON 資料類型。而 JSON 是一種輕量級的資料交換格式,非常易于使用者閱讀和編寫,同時也易于機器生成和解析。
文檔結構
一般來說,一條文檔由一個或多個字段構成,每個字段分為鍵與值兩個部分,如下為包含兩個字段的文檔:
{ "姓名" : "張三", "性别" : "男" }
其中 "姓名"和"性别"為字段的鍵,而"張三"和"男"為字段的值。
文檔支援嵌套結構和數組,如下為包含嵌套結構和數組的文檔:
{ "姓名" : "張三", "性别" : "男", "位址" : { "省份" : "yy", "城市" : "xx", "街道" : "水藍街" }, "電話" : [ "138xxxxxxxx", "180xxxxxxxx" ] }
其中名為"位址"的字段的值為一個嵌套 JSON 對象, 而名為"電話"的字段的值為一個 JSON 數組。
Note:
關于 JSON 的更多内容,可參考 JSON 官網的介紹
字段的鍵與值
字段的鍵又稱為字段名,其類型為字元串。
字段的值又稱為字段值。它可以為多種類型,如:整數、長整數、浮點數、字元串和對象等。關于字段值的類型,使用者可以參考資料類型章節的介紹。
文檔的限制
文檔存在如下限制:
- 每條文檔的 BSON 編碼最大長度為 16MB。
- 每條文檔必須包括 "_id" 字段。如果使用者沒有提供該字段,系統會自動生成一個 OID 類型的 "_id" 字段。
- "_id" 字段名需要在集合内唯一(若集合為切分集合,則 "_id" 字段名需要在每個切分子集合内唯一)。
- 文檔中各個字段無排列順序,在進行資料操作時(例如進行資料更新),字段之間的順序可能會被調換。
字段名存在如下限制:
- 使用者插入的文檔不允許包含重複的字段名。
- 使用者自定義的字段名不允許以 "$" 字元起始。
- 使用者自定義的字段名不允許包含 "." 字元。
Note:
- 由于 C/CPP BSON 能夠建構重複字段名的 BSON, 而 Java/C# 等其它 BSON 無法建構重複字段名的 BSON,為了保證資料的正确性,使用者無須建構重複字段的 BSON。
- SequoiaDB 内部程式建立的一些文檔(一般為中繼資料)可能含有重複字段名,但 SequoiaDB 不會向使用者的文檔添加重複字段名。
文檔與 SQL 執行個體記錄的比較
與 MySQL 和 PostgreSQL 等傳統關系型資料庫表定義需要指定記錄的 schema 資訊不同,SequoiaDB 的集合中繼資料并不會存儲文檔(記錄)的 schema。在 SequoiaDB 中,文檔的 schema 資訊存儲在文檔自身當中。
如上介紹所述,文檔是一種靈活的資料結構。它存儲的資料包含了字段名和字段值。每個字段在 BSON 中的存儲結構可以簡化為如下格式:

是以文檔自身已經包含了足夠的 schema 資訊。如下顯示在 MySQL 及在 SequoiaDB 查詢資料的情況,使用者可以比較兩種記錄組織方式的差異。
在 MySQL shell 建立名為
sample
的資料庫和名為
employee
表。該資料庫和表分别自動映射到 SequoiaDB 名為
sample
的集合空間和名為
employee
的集合上:
create database sample;
use sample;
create table employee(name varchar(50), sex int, age int, department varchar(100));
insert into employee values("Tom", 0, "25", "R&D");
insert into employee values("Mary", 1, "23", "Test");
select * from employee;
+-------+-------+-------+------------+
| name | sex | age | department |
+-------+-------+-------+------------|
| "Tom" | 0 | 25 | "R&D" |
| "Mary"| 1 | 23 | "Test" |
+-------+-------+-------+------------|
在 SequoiaDB 上查詢插入的資料:
sdb> db.sample.employee.find()
{ "_id": { "$oid": "5d1da52b38892b0af758ee5f" }, "name": "Tom", "sex": 0, "age": 25, "department": "R&D" }
{ "_id": { "$oid": "5d1da53138892b0af758ee60" }, "name": "Mary", "sex": 1, "age": 23, "department": "Test" }
相關閱讀
SequoiaDB 巨杉資料庫複制組監控