面向文件的資料庫或文件儲存，是用於儲存、檢索和管理面向文件的資訊的一種計算機程式。這裡稱為文件的是，它是不完全 形式的結構化資料，不服從於與關係資料庫或其他形式資料表有關聯之資料模型的形式結構，然而卻包含標籤或其他標記，用以在資料內分割語義元素和強制記錄和欄位的層級，因此它也叫做「自我描述結構」。 概述 面向文件的資料庫是 NoSQL 資料庫的主要類別之一，且 面向文件的資料庫 一詞的普及程度也因術語 NoSQL 的使用而有所增長 。是針對 XML 文件做了最佳化的面向文件的資料庫的子類。圖資料庫與之相似，但其添加了一個連線各文件的 聯絡 層，以便進行快速遍歷。一些搜尋引擎（也稱為資訊檢索）系統如 Elasticsearch 提供了足夠的對文件的核心操作從而已經滿足了面向文件資料庫的定義。 鍵 值資料庫是 NoSQL 資料庫的另一概念，面向文件的資料庫是鍵 值資料庫的子類。它們的差別在於處理資料的方式：在鍵值資料庫中，資料是對資料庫不透明的；而面向文件的資料庫系統依賴於 文件 的內部結構來獲取元資料，資料庫引擎使用這些元資料進行更深層次的最佳化。雖然由於系統中的工具使這一差別不甚明顯，但在設計概念上，這種文件儲存方式利用了現代程式技術來提供更豐富的體驗。現代鍵 值儲存經常包括處理元資料的特徵，模糊了它與文件儲存之間的界線。 文件資料庫與傳統的關係資料庫差異顯著。關係資料庫通常將資料儲存在相互獨立的表中，這些表由程式開發者定義，一個單一的物件可能散佈在若干表中。 對於一個給定物件，文件資料庫將其所有資訊儲存在資料庫內某個單一例項中，並且儲存的每一個物件可以不同於任一其它物件。這簡化了將物件裝載入資料庫的過程，通常能消除對物件關係對映等類似方案的需求。文件資料庫不同於關係資料庫，關係資料庫基於了關係模型，而文件資料庫採用了，沒有在資料和模式（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 firstnameBobfirstname lastnameSmithlastname phone typeCell123 5550178phone phone typeWork890 5550133phone address typeHometype street1123 Back Ststreet1 cityBoyscity stateARstate zip32225zip countryUScountry 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 JSONLD RDF 全文查詢，ACID 二階段提交，多主複製，Prolog 和 SPARQL。 ArangoDB ArangoDB C NET Java Python Nodejs PHP Scala Go Ruby Elixir 資料庫系統以一個數據庫和統一的查詢語言 AQL（ArangoDB 查詢語言）支援文件儲存以及鍵 值和圖資料模型。 BaseX BaseX Team Java XQuery 支援 XML JSON 和二進位制格式；基於客戶 伺服器的體系；併發結構化和全文查詢及更新。 Caché InterSystems 公司 Java C Nodejs 常用於健康，商務和政府應用。 Cloudant Cloudant Inc Erlang Java Scala 和 C 基於 BigCouch 的分散式資料庫服務，這家公司對 Apache 背景的 CouchDB 計劃的開源仿製。 使用 JSON 模型。 Clusterpoint Database Clusterpoint Ltd ，有免費下載 JavaScript SQL PHP NET Java Python Nodejs C C 分散式面向文件 XMLJSON 資料庫平臺，有著服從 ACID 的事務；高可用性資料複製和分片；帶有相關性排名的內建全文查詢引擎；JSSQL 查詢語言；GIS；可獲得為每使用付費雲資料庫或作為一個 onpremise 免費軟體下載。 Couchbase Server Couchbase Inc C NET Java Python Nodejs PHP SQL Go Spring Framework LINQ 分散式 NoSQL 文件資料庫，JSON 模型和基於 SQL 的查詢語言。 Documentation Couchbase Retrieved on 20130918 CouchDB Apache 軟體基金會 可以發起 HTTP 請求的任何語言 JSON 於 RESTHTTP 上，有著多版本併發控制和有限的 ACID 特性。對檢視和查詢使用 map 和 reduce。CouchDB Overview CrateIO CRATE Technology GmbH Java 對跨越叢集的即時分散式查詢使用類似 SQL 語法。基於了 LuceneElasticsearch 生態系統帶有對二進位制物件（BLOB）的內建支援。 Cosmos DB Microsoft NET Java Python Nodejs JavaScript SQL 提供 PlatformasaService，是 Microsoft Azure 的一部分。建造於早期 Azure DocumentDB 之上並進行了擴充套件。 DocumentDB Amazon Web Services 專有線上服務 各種，REST 完全管理的 MongoDB v36 相容資料庫服務 Elasticsearch Shay Banon Java JSON 查詢引擎。 eXist eXist XQuery Java XML 在 RESTHTTP 之上，WebDAV Lucene 全文查詢，二進位制資料支援，驗證，版本控制，叢集，觸發器，URL 重寫，收集，ACLS XQuery 更新 eXistdb Open Source Native XML Database Existdborg Retrieved on 20130918 Informix IBM 專有，帶有非付費版本 各種（兼容於 MongoDB API） RDBMS 帶有 JSON 複製，分片和 ACID 遵守。 Jackrabbit Apache 基金會 Java Java Content Repository 實現 Lotus Notes IBM Lotus Domino IBM LotusScript Java Lotus Formula MultiValue MarkLogic MarkLogic 公司 免費開發者許可證或商業 Java JavaScript Nodejs XQuery SPARQL XSLT C 分散式面向文件資料庫，對於 JSON XML 和 RDF triples。內建全文查詢，ACID 事務，高可用性和災難恢復，證書安全性。 MongoDB MongoDB Inc 對 DBMS 為伺服器端公共許可證，對客戶驅動程式為 Apache2 許可證 C C C Java Perl PHP Python Go Nodejs Ruby Rust Scala 文件資料庫帶有複製和分片，BSON 儲存（二進位制格式 JSON）。 MUMPS 資料庫 Proprietary 和 Affero GPL MUMPS 常用於健康應用。 ObjectDatabase Ekky 軟體 C C TScript 二進位制原生 C 類結構 OpenLink Virtuoso OpenLink 軟體 GPLv2 1 和專有 C C Java SPARQL 中介軟體和資料庫引擎混合 OrientDB Orient 技術 Java JSON 在 HTTP 之上，SQL 支援，ACID 事務 PostgreSQL PostgreSQL C HStore JSON 儲存 92 JSON 函式 93 HStore2 94 JSONB 94 Qizx Qualcomm REST Java XQuery XSLT C C Python 分散式面向文件 XML 資料庫帶有整合的全文查詢；支援 JSON 文字和二進位制。 RethinkDB C Python JavaScript Ruby Java 分散式面向文件 JSON 資料庫帶有複製和分片。 SAP HANA SAP 類 SQL 語言 ACID 事務支援，唯 JSON Sedna sednaorg C XQuery XML 資料庫 SimpleDB Amazon Web Services 專有線上服務 Erlang Solr Apache Java 查詢引擎 TokuMX Tokutek C C Go MongoDB 帶有分形樹索引 XML 資料庫實現 大多數 XML 資料庫是面向文件資料庫。 註釋 參考文獻 延伸閱讀 Assaf Arkin 2007 September 20 Read Consistency Dumb Databases Smart Services 外部連結 DBEngines Ranking of Document Stores by popularity updated monthly Category 資料管理 Category 資料庫管理系統 Category 各類資料庫