什么是文档存储数据库?
文档存储数据库(也称为面向文档的数据库、聚合数据库或简称文档存储或文档数据库)是使用面向文档的模型来存储数据的数据库。
文档存储数据库将每条记录及其相关数据存储在单个_文档_中。每个文档都包含半结构化数据,可以使用DBMS的各种查询和分析工具进行查询。
文档示例
以下是可以存储在文档数据库中的两个文档示例。两个示例都使用相同的数据——它们只是用不同的语言编写的。
这是第一个示例,用 XML 编写。
<艺术家>
这是相同的示例,但这次是用 JSON 编写的。
{ ‘_id’:1, “艺术家姓名”:{“铁娘子”}, “专辑”:[ { “专辑名”:“灵魂之书”, “发布日期”:2015 年, “流派”:“硬摇滚” }, { ‘专辑名’:‘杀手’, “发布日期”:1981 年, “流派”:“硬摇滚” }, { ‘专辑名’ : ‘Powerslave’, “发布日期”:1984 年, “流派”:“硬摇滚” }, { ‘albumname’ : ‘Somewhere in Time’, “发布日期”:1986 年, “流派”:“硬摇滚” } ] }
请注意,我决定_id在第二个示例中添加一个字段。DBMS 可能需要也可能不需要,但是,如果未提供唯一 ID 字段,某些 DBMS 将自动插入唯一 ID 字段。
文档存储与关系数据库
如果我们将上述数据输入到关系数据库中,这些信息通常会存储在三个不同的表中——通过它们的主键和外键字段将它们链接在一起。
以下是关系数据库存储上述数据的方式。
艺术家
| 艺术家 ID | 艺术家姓名 | | 1 | 铁娘子 | | 2 | 德文汤森 | | 3 | 威格斯 | | 4 | … |
相册
| 专辑编号 | 专辑名称 | 发布日期 | 艺术家 ID | 类型 ID | | 1 | 灵魂之书 | 2015 | 1 | 3 | | 2 | 杀手 | 1981年 | 1 | 3 | | 3 | 动力奴隶 | 1984年 | 1 | 3 | | 4 | 时间的某个地方 | 1986年 | 1 | 3 | | 5 | 全知者齐尔托德 | 2007年 | 2 | 3 | | 6 | … | … | … | … |
类型
| 类型 ID | 类型 | | 1 | 国家 | | 2 | 蓝调 | | 3 | 硬石 | | 4 | … |
这是这些表之间的关系(在 MySQL 中完成):
三个表之间的关系图。主键和外键字段已突出显示。
因此这表明文档存储数据库和关系数据库之间存在一些显着差异。
以下是一些主要的。
表
关系数据库将数据存储在多个 表中,每个表包含列,每行代表每条记录。有关任何给定实体的信息可以分布在许多表中。来自不同表的数据只能通过建立表之间的关系来关联。
另一方面,文档数据库不要使用表格。它们将给定实体的所有数据存储在单个文档中。任何关联的数据都存储在该文档中。
模式
对于关系数据库,您必须在加载任何数据之前创建模式。使用文档存储数据库(和大多数其他NoSQL数据库),您没有这样的要求。您可以继续加载数据而无需任何预定义架构。
因此,对于文档存储,任何两个文档都可以包含不同的结构和数据类型。例如,如果一个用户选择不提供他的出生日期,那甚至不会是文档中的一个字段。如果另一个用户确实提供了她的出生日期,那将是_该_文档中的一个字段。如果这是一个关系数据库,那么出生日期仍然是两个用户的字段——它只是不包含值。
可扩展性
文档数据库可以很好地水平扩展。数据可以存储在数千台计算机上,系统运行良好。这通常被称为_分片_。
关系数据库不太适合以这种方式进行扩展。关系数据库更适合垂直扩展(即添加更多内存、存储等)。鉴于您可以在一台机器中容纳多少资源是有限制的,因此水平扩展可能会成为唯一的选择。
关系
文档存储没有关系数据库那样的外键。关系数据库使用外键来加强表之间的关系。如果需要与文档数据库建立关系,则需要在应用程序级别完成。
但是,文档模型背后的整个想法是,与记录关联的任何数据都存储在同一个文档中。因此,在使用文档模型时建立关系的需求不应该像在关系数据库中那样普遍。
NoSQL
大多数关系数据库使用SQL作为标准查询语言。文档存储数据库倾向于使用其他查询语言(尽管有些是为支持 SQL 而构建的)。许多文档数据库可以使用 XQuery、XSLT、SPARQL、Java、JavaScript、Python 等语言进行查询。
文档存储与键值数据库
文档数据库类似于键值数据库,有一个键和一个值。数据存储为一个值。其关联键是该值的唯一标识符。
不同之处在于,在_文档_数据库中,值包含结构化或半结构化数据。该结构化/半结构化值称为文档。
构成文档的结构化/半结构化数据可以使用任意数量的方法之一进行编码,包括 XML、JSON、YAML、BSON 等。它也可以使用二进制编码,例如 PDF、MS Office 文档、等等
文档模型优于键值存储
文档存储数据库相对于键值数据库的一个好处是您可以查询数据本身。您可以查询文档的结构以及该结构中的元素。因此,您可以只返回您需要的文档部分。
使用键值数据库,您可以获得全部价值——无论它有多大(并且看似结构化)。您无法在值内进行查询。
文档数据库可以用来做什么?
面向文档的数据库非常适合各种用例。以下是文档数据库可能有用的一些示例。
网络应用程序
- 内容管理系统
- 博客平台
- 电子商务应用
- 网络分析
- 用户偏好数据
用户生成内容
- 聊天会话
- 推文
- 博客文章
- 收视率
- 注释
目录数据
- 用户帐户
- 产品目录
- 物联网设备注册表
- 物料清单系统
赌博
- 游戏内统计
- 社交媒体整合
- 高分排行榜
- 游戏内聊天消息
- 玩家公会会员资格
- 已完成挑战
网络/计算
- 来自移动设备的传感器数据
- 日志文件
- 实时分析
- 来自物联网的各种其他数据
文档存储 DBMS 示例
有许多面向文档的数据库管理系统可用。有些是开源的,有些是专有的。
以下是一些领先的文档存储 DBMS 的示例。
