面向文檔的數據庫
面向文檔的數據庫(英語:Document-oriented database)或文檔存儲,是用於存儲、檢索和管理面向文檔的信息的一種計算機程序。這裡稱為文檔的是半結構化數據[1],它是不完全形式的結構化數據,不服從於與關係數據庫或其他形式數據表有關聯之數據模型的形式結構,然而卻包含標籤或其他標記,用以在數據內分割語義元素和強制記錄和字段的層級,因此它也叫做「自我描述結構」。
概述
面向文檔的數據庫是NoSQL數據庫的主要類別之一,且「面向文檔的數據庫」一詞的普及程度也因術語NoSQL的使用而有所增長[2] 。XML數據庫是針對XML文檔做了優化的面向文檔的數據庫的子類。圖數據庫與之相似,但其添加了一個連接各文檔的「聯繫」層,以便進行快速遍歷。一些搜索引擎(也稱為信息檢索)系統如Elasticsearch提供了足夠的對文檔的核心操作從而已經滿足了面向文檔數據庫的定義。
鍵-值數據庫是NoSQL數據庫的另一概念,面向文檔的數據庫是鍵-值數據庫的子類。它們的差別在於處理數據的方式:在鍵值數據庫中,數據是對數據庫不透明的;而面向文檔的數據庫系統依賴於「文檔」的內部結構來獲取元數據,數據庫引擎使用這些元數據進行更深層次的優化。雖然由於系統中的工具使這一差別不甚明顯,[a]但在設計概念上,這種文檔存儲方式利用了現代程序技術來提供更豐富的體驗。現代鍵-值存儲經常包括處理元數據的特徵,模糊了它與文檔存儲之間的界線。
文檔數據庫[b]與傳統的關係數據庫差異顯著。關係數據庫通常將數據存儲在相互獨立的表中,這些表由程序開發者定義,一個單一的對象可能散布在若干表中。 對於一個給定對象,文檔數據庫將其所有信息存儲在數據庫內某個單一實例中,並且存儲的每一個對象可以不同於任一其它對象。這簡化了將對象裝載入數據庫的過程,通常能消除對對象關係映射等類似方案的需求。文檔數據庫不同於關係數據庫,關係數據庫基於了關係模型,而文檔數據庫採用了半結構化模型,沒有在數據和模式(schema)之間的分離,使用的結構的數量依賴於目標用途。在半結構化數據中,屬於相同類的實體可有不同的特性,即使它們被分組在一起,並且屬性的次序是不重要的。
文檔
面向文檔數據庫的中心概念是「文檔」這個概念。儘管每個面向文檔數據庫實現在這個定義的細節上都有所不同,一般而言,它們都假定文檔以某種標準格式或編碼來封裝和編碼數據(或信息)。面向文檔數據庫使用的編碼包括XML、YAML、JSON和BSON,有的實現還可以存儲二進制文檔格式如PDF和Microsoft Office文檔(MS Word、Excel之類)。
在文檔存儲中的文檔粗略的等價於對象這個編程概念。不要求它們遵守標準模式(schema),也不要求它們都有同樣的章節、插槽(slot)、部分(part)或鍵。一般地說,使用對象的程序有很多不同的對象類型,而這些對象經常有很多可選的字段(field)。每個對象,即使是同類的,也可以看起來非常不同。文檔存儲類似於此,它們在一個單一存儲中允許不同類型的文檔,運行在文檔中的字段是可選的,並且經常允許它們使用不同的編碼系統來編碼。例如,下面是一個文檔,採用JSON編碼:
{
"FirstName": "Bob",
"Address": "5 Oak St.",
"Hobby": "sailing"
}
第二個文檔可以採用XML來編碼:
<contact>
<firstname>Bob</firstname>
<lastname>Smith</lastname>
<phone type="Cell">(123) 555-0178</phone>
<phone type="Work">(890) 555-0133</phone>
<address>
<type>Home</type>
<street1>123 Back St.</street1>
<city>Boys</city>
<state>AR</state>
<zip>32225</zip>
<country>US</country>
</address>
</contact>
這兩個文檔相互共享一些結構性元素,但每個都有唯一性元素。在文檔內部的結構和正文及其他數據通常被稱為文檔的「內容」,並可以通過通過檢索或編輯方法(見下文)來引用。關係數據庫中,所有記錄包含同樣的字段,保留未使用字段為空;不同於關係數據庫,在上述例子的這兩個文檔(記錄)中都沒有空「字段」。這種方式允許向某些記錄增加新信息而不要求在數據庫中的所有其他記錄共享相同結構。
文檔數據典型的提供了關聯於文檔內容並與之一起存儲的額外的元數據。這種元數據還可以與增進數據存儲有關,提供組織文檔,提供安全性,或其他特定於實現的特性。
CRUD操作
面向文檔數據對文檔提供類似於其他數據庫的核心操作,儘管術語未完全標準化,大多數實踐者將它們認可為CRUD:
- 建立(或插入)
- 檢索(或查詢、查找、讀取或尋找)
- 更新(或編輯)
- 刪除(或移除)
鍵
在數據庫的文檔通過代表這個文檔的唯一的「鍵」來尋址。鍵是一個簡單的標識符(簡寫為ID),典型的是字符串、URI或路徑。鍵可以用來從數據中檢索文檔。數據庫典型的在鍵上保有索引來加速文檔檢索,並且在某些情況下要求用鍵來把文檔建立或插入到數據庫中。
檢索
面向文檔數據的另一個定義特徵,使之超越可用來檢索文檔的簡單的鍵到文檔查找,就是數據庫提供允許用戶基於內容(或元數據)來檢索文檔的API或查詢語言。例如,你可能需要一個查詢,檢索特定字段被設置為特定值的所有文檔。可獲得的查詢API或查詢語言的特徵的集合,還有查詢的預期性能,在不同實現之間有顯著差異。類似的,可獲得的索引選項和配置的特有集合隨着不同實現而有着巨大差異。
文檔存儲和鍵-值存儲有很大差異。在理論上,在鍵-值存儲中值對於存儲是不透明的,它們本質上是黑箱子。它們可以提供類似於文檔存儲的的查找系統,但是對內容的組織有着更少的理解。文檔存儲使用在文檔中的元數據來分類內容,例如允許它們理解一個數字序列是電話號碼,而另一個是郵政編碼。這允許它們在這種類型的數據上進行查找,例如,包含555的所有電話號碼,但忽略郵編 55555。
編輯
文檔數據典型的提供某種機制來更新或編輯文檔的內容(或元數據),替換要麼允許在整個文檔上,要麼在文檔的個別結構片段上。
組織
文檔數據庫實現提供各種方式來組織文檔,包括如下概念:
- 收集(Collection):成組的文檔,依賴於具體實現,文檔可以被強制存留在一個收集內部,也可以被允許存留在多個收集之內。
- 標籤(Tag)和不可見元數據:在文檔內容之外的附加數據。
- 目錄層級:組織成樹狀結構的成組文檔,典型的基於路徑或URI。
有時這些組織概念在它們是邏輯的還是物理的、(比如在磁盤上還是在內存中)、表示等方面有一些變化。
實現
名稱 | 發行商 | 許可證 | 支持語言 | 注釋 | RESTful API |
---|---|---|---|---|---|
AllegroGraph | Franz, Inc. | 專有 | Java, Python, Common Lisp, Ruby, Scala, .NET, Perl | 數據庫平台在一個單一數據內支持文檔存儲和圖數據模型。支持JSON, JSON-LD, RDF, 全文查找, ACID, 二階段提交, 多主複製, Prolog 和 SPARQL。 | 是[3] |
ArangoDB | ArangoDB | Apache License | C, .NET, Java, Python, Node.js, PHP, Scala, Go, Ruby, Elixir | 數據庫系統以一個數據庫和統一的查詢語言AQL(ArangoDB 查詢語言)支持文檔存儲以及鍵/值和圖數據模型。 | 是[4] |
BaseX | BaseX Team | BSD License | Java, XQuery | 支持 XML, JSON 和二進制格式;基於客戶/服務器的體系;並髮結構化和全文查找及更新。 | 是 |
Caché | InterSystems 公司 | 專有 | Java, C#, Node.js | 常用於健康, 商務和政府應用。 | 是 |
Cloudant | Cloudant, Inc. | 專有 | Erlang, Java, Scala, 和 C | 基於BigCouch的分布式數據庫服務,這家公司對Apache背景的CouchDB計劃的開源仿製。 使用JSON模型。 | 是 |
Clusterpoint Database | Clusterpoint Ltd. | 專有,有免費下載 | JavaScript, SQL, PHP, .NET, Java, Python, Node.js, C, C++, | 分布式面向文檔XML/JSON數據庫平台,有着服從ACID的事務;高可用性數據複製和分片;帶有相關性排名的內建全文查找引擎;JS/SQL查詢語言;GIS;可獲得為每使用付費雲數據庫或作為一個on-premise免費軟件下載。 | 是 |
Couchbase Server | Couchbase, Inc. | Apache License | C, .NET, Java, Python, Node.js, PHP, SQL, Go, Spring Framework, LINQ | 分布式NoSQL文檔數據庫, JSON模型和基於SQL的查詢語言。 | 是[5] |
CouchDB | Apache軟件基金會 | Apache License | 可以發起HTTP請求的任何語言 | JSON於REST/HTTP上,有着多版本並發控制和有限的ACID特性。對視圖和查詢使用map和reduce。[6] | 是[7] |
CrateIO | CRATE Technology GmbH | Apache License | Java | 對跨越集群的實時分布式查詢使用類似SQL語法。基於了Lucene/Elasticsearch生態系統帶有對二進制對象(BLOB)的內建支持。 | 是[8] |
Cosmos DB | Microsoft | 專有 | .NET, Java, Python, Node.js, JavaScript, SQL | 提供Platform-as-a-Service,是Microsoft Azure的一部分。建造於早期Azure DocumentDB之上並進行了擴展。 | 是 |
DocumentDB | Amazon Web Services | 專有在線服務 | 各種, REST | 完全管理的MongoDB v3.6-兼容數據庫服務 | 是 |
Elasticsearch | Shay Banon | Apache License | Java | JSON, 查找引擎。 | 是 |
eXist | eXist | LGPL | XQuery, Java | XML在REST/HTTP之上, WebDAV, Lucene全文查找, 二進制數據支持, 驗證, 版本控制, 集群, 觸發器, URL重寫, 收集, ACLS, XQuery更新 | 是[9] |
Informix | IBM | 專有, 帶有非付費版本[10] | 各種(兼容於 MongoDB API) | RDBMS 帶有 JSON, 複製, 分片和 ACID遵守。 | 是 |
Jackrabbit | Apache基金會 | Apache License | Java | Java Content Repository實現 | ? |
Lotus Notes (IBM Lotus Domino) | IBM | 專有 | LotusScript, Java, Lotus @Formula | MultiValue | 是 |
MarkLogic | MarkLogic 公司 | 免費開發者許可證或商業[11] | Java, JavaScript, Node.js, XQuery, SPARQL, XSLT, C++ | 分布式面向文檔數據庫,對於 JSON, XML, 和RDF triples。內建全文查找, ACID事務, 高可用性和災難恢復, 證書安全性。 | 是 |
MongoDB | MongoDB, Inc | 對DBMS為服務器端公共許可證, 對客戶驅動程序為Apache2許可證[12] | C, C++, C#, Java, Perl, PHP, Python, Go, Node.js, Ruby, Rust[13], Scala[14] | 文檔數據庫帶有複製和分片, BSON存儲(二進制格式JSON)。 | 是[15] |
MUMPS 數據庫 | ? | Proprietary 和 Affero GPL[16] | MUMPS | 常用於健康應用。 | ? |
ObjectDatabase++ | Ekky 軟件 | 專有 | C++, C#, TScript | 二進制原生C++類結構 | ? |
OpenLink Virtuoso | OpenLink 軟件 | GPLv2[1]和專有 | C++, C#, Java, SPARQL | 中間件和數據庫引擎混合 | 是 |
OrientDB | Orient 技術 | Apache License | Java | JSON在HTTP之上, SQL支持, ACID事務 | 是 |
PostgreSQL | PostgreSQL | PostgreSQL Free License[17] | C | HStore, JSON存儲(9.2+), JSON函數(9.3+), HStore2 (9.4+), JSONB (9.4+) | 否 |
Qizx | Qualcomm | 專有 | REST, Java, XQuery, XSLT, C, C++, Python | 分布式面向文檔XML數據庫帶有集成的全文查找;支持JSON, 文本和二進制。 | 是 |
RethinkDB | ? | 對DBMS為GNU AGPL,對客戶驅動程序為Apache 2 License | C++, Python, JavaScript, Ruby, Java | 分布式面向文檔JSON數據庫帶有複製和分片。 | 否 |
SAP HANA | SAP | 專有 | 類SQL語言 | ACID事務支持, 唯JSON | 是 |
Sedna | sedna.org | Apache License | C++, XQuery | XML數據庫 | 否 |
SimpleDB | Amazon Web Services | 專有在線服務 | Erlang | ? | |
Solr | Apache | Apache License | Java | 查找引擎 | 是 |
TokuMX | Tokutek | GNU Affero General Public License | C++, C#, Go | MongoDB帶有分形樹索引 | ? |
XML數據庫實現
大多數XML數據庫是面向文檔數據庫。
注釋
參考文獻
- ^ Peter Buneman. Semistructured data (PDF). Symposium on Principles of Database Systems. 1997 [2019-05-16]. (原始內容存檔 (PDF)於2021-04-17). 參數
|journal=
與模板{{cite web}}
不匹配(建議改用{{cite journal}}
或|website=
) (幫助) - ^ DB-Engines Ranking per database model category. [2016-08-22]. (原始內容存檔於2021-05-16).
- ^ HTTP Protocol for AllegroGraph. [2019-05-15]. (原始內容存檔於2021-04-14).
- ^ 存档副本. [2022-02-13]. (原始內容存檔於2021-02-10).
- ^ Documentation 網際網路檔案館的存檔,存檔日期2012-08-20.. Couchbase. Retrieved on 2013-09-18.
- ^ CouchDB Overview 網際網路檔案館的存檔,存檔日期October 20, 2011,.
- ^ HTTP_Document_API - Couchdb Wiki. [2019-05-15]. (原始內容存檔於2013-03-01).
- ^ Archived copy. [2015-06-22]. (原始內容存檔於2015-06-22).
- ^ eXist-db Open Source Native XML Database (頁面存檔備份,存於網際網路檔案館). Exist-db.org. Retrieved on 2013-09-18.
- ^ Compare the Informix Version 12 editions. 22 July 2016 [2019-05-15]. (原始內容存檔於2020-11-09).
- ^ MarkLogic Licensing. [2019-05-15]. (原始內容存檔於2012-01-12).
- ^ MongoDB Licensing. [2019-05-15]. (原始內容存檔於2015-09-05).
- ^ The New MongoDB Rust Driver. MongoDB. [2018-02-01]. (原始內容存檔於2021-04-14) (美國英語).
- ^ Community Supported Drivers Reference. [2019-05-15]. (原始內容存檔於2016-04-11).
- ^ MongoDB REST Interfaces. [2019-05-15]. (原始內容存檔於2013-01-29).
- ^ GT.M High end TP database engine. [2019-05-15]. (原始內容存檔於2021-04-17).
- ^ 存档副本. [2019-05-15]. (原始內容存檔於2021-05-17).
延伸閱讀
- Assaf Arkin. (2007, September 20). Read Consistency: Dumb Databases, Smart Services.
外部連結
- DB-Engines Ranking of Document Stores (頁面存檔備份,存於網際網路檔案館) by popularity, updated monthly