面向文件的數據庫

用於儲存、檢索與管理半結構化、物件導向資訊的電腦程式

文件導向的資料庫(英語:Document-oriented database)或文件儲存,是用於儲存、檢索和管理文件導向的資訊的一種電腦程式。這裏稱為文件的是半結構化數據英語Semi-structured data[1],它是不完全形式的結構化數據,不服從於與關聯式資料庫或其他形式數據表有關聯之數據模型的形式結構,然而卻包含標籤或其他標記,用以在數據內分割語意元素和強制記錄和欄位的層級,因此它也叫做「自我描述結構」。

概述

文件導向的資料庫是NoSQL資料庫的主要類別之一,且「文件導向的資料庫」一詞的普及程度也因術語NoSQL的使用而有所增長[2]XML資料庫英語XML database是針對XML文件做了最佳化的文件導向的資料庫的子類。圖資料庫與之相似,但其添加了一個連接各文件的「聯絡」層,以便進行快速遍歷。一些搜尋引擎(也稱為資訊檢索)系統如Elasticsearch提供了足夠的對文件的核心操作從而已經滿足了文件導向資料庫的定義。

鍵-值資料庫是NoSQL資料庫的另一概念,文件導向的資料庫是鍵-值資料庫的子類。它們的差別在於處理數據的方式:在鍵值資料庫中,數據是對資料庫不透明的;而文件導向的資料庫系統依賴於「文件」的內部結構來取得元數據,資料庫引擎使用這些元數據進行更深層次的最佳化。雖然由於系統中的工具使這一差別不甚明顯,[a]但在設計概念上,這種文件儲存方式利用了現代程式技術來提供更豐富的體驗。現代鍵-值儲存經常包括處理元數據的特徵,模糊了它與文件儲存之間的界線。

文件資料庫[b]與傳統的關聯式資料庫差異顯著。關聯式資料庫通常將數據儲存在相互獨立的表中,這些由程式開發者定義,一個單一的對象可能散佈在若干表中。 對於一個給定對象,文件資料庫將其所有資訊儲存在資料庫內某個單一實例中,並且儲存的每一個對象可以不同於任一其它對象。這簡化了將對象裝載入資料庫的過程,通常能消除對對象關係對映等類似方案的需求。文件資料庫不同於關聯式資料庫,關聯式資料庫基於了關係模型,而文件資料庫採用了半結構化模型英語Semi-structured model,沒有在數據和模式(schema)之間的分離,使用的結構的數量依賴於目標用途。在半結構化數據中,屬於相同實體可有不同的特性英語Variable and attribute (research),即使它們被分組在一起,並且屬性的次序是不重要的。

文件

文件導向資料庫的中心概念是「文件」這個概念。儘管每個文件導向資料庫實現在這個定義的細節上都有所不同,一般而言,它們都假定文件以某種標準格式編碼來封裝和編碼數據(或資訊)。文件導向資料庫使用的編碼包括XMLYAMLJSONBSON,有的實現還可以儲存二進制文件格式如PDF和Microsoft Office文件(MS WordExcel之類)。

在文件儲存中的文件粗略的等價於對象這個編程概念。不要求它們遵守標準模式(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, 二階段提交, 多主複製, PrologSPARQL [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特性。對視圖和查詢使用mapreduce[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 資料庫 ? ProprietaryAffero 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資料庫是文件導向資料庫。

註釋

  1. ^ 文件導向資料庫和鍵值資料庫系統通常能在應用時相互替換。
  2. ^ 以及鍵值資料庫(一般來說)。

參考文獻

  1. ^ 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=) (幫助)
  2. ^ DB-Engines Ranking per database model category. [2016-08-22]. (原始內容存檔於2021-05-16). 
  3. ^ HTTP Protocol for AllegroGraph. [2019-05-15]. (原始內容存檔於2021-04-14). 
  4. ^ 存档副本. [2022-02-13]. (原始內容存檔於2021-02-10). 
  5. ^ Documentation 互聯網檔案館存檔,存檔日期2012-08-20.. Couchbase. Retrieved on 2013-09-18.
  6. ^ CouchDB Overview 互聯網檔案館存檔,存檔日期October 20, 2011,.
  7. ^ HTTP_Document_API - Couchdb Wiki. [2019-05-15]. (原始內容存檔於2013-03-01). 
  8. ^ Archived copy. [2015-06-22]. (原始內容存檔於2015-06-22). 
  9. ^ eXist-db Open Source Native XML Database頁面存檔備份,存於互聯網檔案館). Exist-db.org. Retrieved on 2013-09-18.
  10. ^ Compare the Informix Version 12 editions. 22 July 2016 [2019-05-15]. (原始內容存檔於2020-11-09). 
  11. ^ MarkLogic Licensing. [2019-05-15]. (原始內容存檔於2012-01-12). 
  12. ^ MongoDB Licensing. [2019-05-15]. (原始內容存檔於2015-09-05). 
  13. ^ The New MongoDB Rust Driver. MongoDB. [2018-02-01]. (原始內容存檔於2021-04-14) (美國英語). 
  14. ^ Community Supported Drivers Reference. [2019-05-15]. (原始內容存檔於2016-04-11). 
  15. ^ MongoDB REST Interfaces. [2019-05-15]. (原始內容存檔於2013-01-29). 
  16. ^ GT.M High end TP database engine. [2019-05-15]. (原始內容存檔於2021-04-17). 
  17. ^ 存档副本. [2019-05-15]. (原始內容存檔於2021-05-17). 

延伸閱讀

外部連結