面向文档的数据库(英语:Document-oriented database)或文档存储,是用于存储、检索和管理面向文档的信息的一种计算机程序。这里称为文档的是半结构化数据(英语:Semi-structured data),它是不完全形式的结构化数据,不服从于与关系数据库或其他形式数据表有关联之数据模型的形式结构,然而却包含标签或其他标记,用以在数据内分割语义元素和强制记录和字段的层级,因此它也叫做“自我描述结构”。
面向文档的数据库是NoSQL数据库的主要类别之一,且“面向文档的数据库”一词的普及程度也因术语NoSQL的使用而有所增长 。XML数据库(英语:XML database)是针对XML文档做了优化的面向文档的数据库的子类。图数据库与之相似,但其添加了一个连接各文档的“联系”层,以便进行快速遍历。一些搜索引擎(也称为信息检索)系统如Elasticsearch提供了足够的对文档的核心操作从而已经满足了面向文档数据库的定义。
键-值数据库是NoSQL数据库的另一概念,面向文档的数据库是键-值数据库的子类。它们的差别在于处理数据的方式:在键值数据库中,数据是对数据库不透明的;而面向文档的数据库系统依赖于“文档”的内部结构来获取元数据,数据库引擎使用这些元数据进行更深层次的优化。虽然由于系统中的工具使这一差别不甚明显,但在设计概念上,这种文档存储方式利用了现代程序技术来提供更丰富的体验。现代键-值存储经常包括处理元数据的特征,模糊了它与文档存储之间的界线。
文档数据库与传统的关系数据库差异显著。关系数据库通常将数据存储在相互独立的表中,这些表由程序开发者定义,一个单一的对象可能散布在若干表中。 对于一个给定对象,文档数据库将其所有信息存储在数据库内某个单一实例中,并且存储的每一个对象可以不同于任一其它对象。这简化了将对象装加载数据库的过程,通常能消除对对象关系映射等类似方案的需求。文档数据库不同于关系数据库,关系数据库基于了关系模型,而文档数据库采用了半结构化模型(英语:Semi-structured model),没有在数据和模式(schema)之间的分离,使用的结构的数量依赖于目标用途。在半结构化数据中,属于相同类的实体可有不同的特性(英语:Variable and attribute (research)),即使它们被分组在一起,并且属性的次序是不重要的。
面向文档数据库的中心概念是“文档”这个概念。尽管每个面向文档数据库实现在这个定义的细节上都有所不同,一般而言,它们都假定文档以某种标准格式或编码来封装和编码数据(或信息)。面向文档数据库使用的编码包括XML、YAML、JSON和BSON,有的实现还可以存储二进制文档格式如PDF和Microsoft Office文档(MS Word、Excel之类)。
在文档存储中的文档粗略的等价于对象这个编程概念。不要求它们遵守标准模式(schema),也不要求它们都有同样的章节、插槽(slot)、部分(part)或键。一般地说,使用对象的程序有很多不同的对象类型,而这些对象经常有很多可选的字段(field)。每个对象,即使是同类的,也可以看起来非常不同。文档存储类似于此,它们在一个单一存储中允许不同类型的文档,运行在文档中的字段是可选的,并且经常允许它们使用不同的编码系统来编码。例如,下面是一个文档,采用JSON编码:
{ "FirstName": "Bob", "Address": "5 Oak St.", "Hobby": "sailing"}