MongoDB World is back in NYC June 7 - 9!

什么是文档数据库?

文档数据库(又称面向文档的数据库或文档存储)是一种以文档形式存储信息的数据库。

JSON 文档的示例。

文档数据库具有多种优势,包括:

  • 直观的数据模型,开发者可以快速、轻松地使用
  • 灵活的架构,允许数据模型随着应用程序需求的变化而演变
  • 支持横向扩展能力

得益于这些优势,文档数据库是通用数据库,可用于各种应用场景和行业。

文档数据库被认为属于非关系(或 NoSQL)数据库。文档数据库不再将数据存储在固定的行和列中,而是使用灵活的文档格式。文档数据库是传统关系数据库表格模型最常用的替代方案。详细了解 NoSQL 数据库

文档是什么?

文档是文档数据库中的记录。文档通常存储有关一个对象及其相关元数据的的信息。文档以“字段-值”对的形式存储数据。值可以是各种类型和结构,包括字符串、数字、日期、数组或对象。文档可以存储为 JSON、BSON 和 XML 等格式。

以下是一个 JSON 文档,其中存储了名为 Tom 的用户的信息。

{
     "_id": 1,
     "first_name": "Tom",
     "email": "tom@example.com",
     "cell": "765-555-5555",
     "likes": [
        "fashion",
        "spas",
        "shopping"
     ],
     "businesses": [
        {
           "name": "Entertainment 1080",
           "partner": "Jean",
           "status": "Bankrupt",
           "date_founded": {
              "$date": "2012-05-19T04:00:00Z"
           }
        },
        {
           "name": "Swag for Tweens",
           "date_founded": {
              "$date": "2012-11-01T04:00:00Z"
           }
        }
     ]
  }

Collections

A collection is a group of documents. 通常,集合会存储具有相似内容的文档。

由于文档数据库具有灵活的架构,集合中的所有文档并不需要具有相同的字段。请注意,某些文档数据库提供模式验证,因此可以在需要时选择性地锁定该架构。

继续上面的示例,包含关于 Tom 信息的文档可以存储在名为“users”的集合中。可以向“users”集合中添加更多文档,以存储其他用户的信息。例如,下面存储有关 Donna 信息的文档可以添加到“users”集合中。

 {
     "_id": 2,
     "first_name": "Donna",
     "email": "donna@example.com",
     "spouse": "Joe",
     "likes": [
        "spas",
        "shopping",
        "live tweeting"
     ],
     "businesses": [
        {
           "name": "Castle Realty",
           "status": "Thriving",
           "date_founded": {
              "$date": "2013-11-21T04:00:00Z"
           }
        }
     ]
  }

请注意,Donna 的文档不包含与 Tom 的文档相同的字段。“users”集合利用灵活的架构来存储每个用户的信息。

CRUD 操作

文档数据库通常具有 API 或查询语言,可允许开发者执行 CRUD(创建、读取、更新和删除)操作。

  • 创建:可以在数据库中创建文档。每个文档都有一个唯一的标识符。
  • 读取:可以从数据库中读取文档。API 或查询语言允许开发者使用文档的唯一标识符或字段值来查询文档。可以向数据库添加索引以提高读取性能。 *更新:现有文档可以全部或部分更新。
  • 删除:可以从数据库中删除文档。

文档型数据库的关键特性是什么?

文档数据库具有以下关键特性:

  • 文档模型: 数据存储在文档中(与其他将数据存储在表格或图表等结构中的数据库不同)。文档在大多数常用的编程语言中映射为对象,这让开发者能够快速开发应用程序。
  • 灵活的架构: 文档数据库具有灵活的架构,这意味着集合中的所有文档并不需要具有相同的字段。请注意,一些文档数据库支持模式验证,因此可以选择性地锁定该架构。
  • 分布式和弹性: 文档数据库是分布式的,可实现水平扩展(通常比垂直扩展的成本更低)和数据分布。文档数据库通过复制提供弹性。
  • 通过 API 或查询语言进行查询:文档数据库提供 API 或查询语言,可允许开发者在数据库上执行 CRUD 操作。开发者有能力根据唯一标识符或字段值来查询文档。

文档数据库与关系数据库有何不同?三个关键因素将文档数据库与关系数据库区分开来:

  1. 数据模型的直观性: 文档映射到代码中的对象,因此使用起来更加自然。无需将数据分解到多个表中,运行成本高昂的连接操作或集成单独的对象关系映射 (ORM) 层。共同访问的数据存储在一起,因此开发者可以编写更少的代码,让最终用户获得更好的性能。
  2. JSON 文档的普及性: JSON 已成为数据交换和存储的既定标准。JSON 文档是轻量级、与语言无关且是人类可读的。文档是所有其他数据模型的超集,因此开发者可以根据其应用程序的需求来构建数据 — 丰富的对象、键值对、表格、地理空间和时间序列数据,或图的节点和边。
  3. 架构的灵活性: 文档的架构是动态且自描述的,因此开发者无需在数据库中预先进行定义。字段可能会因文档而异。开发者可以随时修改结构,避免破坏性的架构迁移。某些文档数据库提供模式验证,因此,您可以选择性地实施管理文档结构的规则。

详细了解 NoSQL 与关系数据库的对比

文档比表格更容易处理吗?

开发者通常发现,在文档中处理数据比在表格中处理数据更容易且更直观。文档映射到大多数常用编程语言中的数据结构。开发者在存储相关数据时不必担心手动将其拆分到多个表中,或在检索时将其重新合并。开发者也不需要使用 ORM 来处理数据操作,而是可以轻松地直接在其应用程序中处理数据。让我们再查看一个名为 Tom 的用户的文档。

Users

{
     "_id": 1,
     "first_name": "Tom",
     "email": "tom@example.com",
     "cell": "765-555-5555",
     "likes": [
        "fashion",
        "spas",
        "shopping"
     ],
     "businesses": [
        {
           "name": "Entertainment 1080",
           "partner": "Jean",
           "status": "Bankrupt",
           "date_founded": {
              "$date": "2012-05-19T04:00:00Z"
           }
        },
        {
           "name": "Swag for Tweens",
           "date_founded": {
              "$date": "2012-11-01T04:00:00Z"
           }
        }
     ]
  }

所有与 Tom 相关的信息都存储在一个文档中。

现在,让我们考虑如何将相同的信息存储在关系数据库中。我们首先创建一个存储用户基本信息的表。

Users

IDfirst_nameemailcell
1Tomtom@example.com765-555-5555

用户可以点赞很多内容(这意味着用户和点赞之间存在一对多的关系),因此我们将创建一个名为“Likes”的新表来存储用户的点赞。“Likes”表将具有一个外键,引用“Users”表中的 ID 列。

Likes

IDuser_idlike
101fashion
111spas
121shopping

同样,用户可以经营许多企业,因此我们将创建一个名为“Businesses”的新表来存储企业信息。“Businesses”表将具有一个外键,引用“Users”表中的“ID”列。

Businesses

IDuser_idnamepartnerstatusdate_founded
201Entertainment 1080JeanBankrupt2011-05-19
211Swag for TweensNULLNULL2012-11-01

在这个简单的示例中,我们看到用户的相关数据可以存储在文档数据库的单个文档中,也可以存储在关系数据库的三个表中。当开发者想要在文档数据库中检索或更新用户信息时,他们可以编写一个无需连接的查询。与数据库的交互非常简单,数据库中的数据建模也很直观。请访问从 SQL 到 MongoDB 的术语和概念映射,了解更多信息。

文档型数据库与其他数据库之间的关系是什么?

文档模型是其他数据模型的超集,包括键值对、关系、对象、图表和地理空间。

  • 键值对可以通过文档中的字段和值进行建模。文档中的任何字段都可以建立索引,从而为开发者在查询数据时提供更高的灵活性。
  • 关系数据可以采用不同的建模方式,即将相关数据保存在单个文档中,使用嵌入文档和数组来进行不同的(有些人认为是更直观的)建模。相关数据也可以存储在单独的文档中,并且可以使用数据库引用 来连接相关数据。
  • 在大多数常用的编程语言中,文档映射到对象
  • 图表节点和/或边可以建模为文档。边缘也可以通过数据库引用 进行建模。可以使用 $graphLookup 等操作来运行图表查询。
  • 地理空间数据可以建模为文档中的数组。

四层图表:
1. 文档模型
2. 键值对、关系、对象、图表、地理空间
3. 统一接口
4. 事务、搜索、移动、实时分析、数据湖 文档模型是其他数据模型的超集_

由于具有丰富的数据建模功能,文档数据库是通用数据库,可用于存储各种应用场景的数据。

为什么不直接在关系数据库中使用 JSON?

随着文档数据库赋能开发者更加快速地构建应用,大多数关系数据库都增加了对 JSON 的支持。但是,简单地添加 JSON 数据类型并不能带来具有原生 JSON 支持的数据库的益处。为什么?这是因为关系方法降低了开发者的工作效率,而不是提高工作效率。这是开发者必须要面对的问题。

专有扩展

处理文档意味着使用定制、供应商相关的 SQL 函数,这些函数对大多数开发者来说并不熟悉,并且无法与您喜欢的 SQL 工具一起使用。添加低级别的 JDBC/ODBC 驱动程序和 ORM,您将面临复杂的开发流程,导致工作效率低下。


原始数据处理

将 JSON 数据呈现为简单的字符串和数字,而不是像 MongoDB 这样的原生文档数据库支持的丰富数据类型,使得计算、比较和排序数据变得复杂且容易出错。


糟糕的数据质量和僵化的表格

关系数据库几乎没有提供验证文档架构的功能,因此您无法对您的 JSON 数据进行质量控制。您仍然需要为常规表格数据定义一个架构,当您需要随着应用程序功能的发展而更改表格时,就会产生额外的开销。


低性能

大多数关系数据库并不维护 JSON 数据的统计信息,从而阻止查询规划器优化针对文档的查询,以及阻碍您调优查询。


无原生横向扩展

传统的关系数据库无法让您跨多个实例对数据库进行分区(分片),以随着工作负载的增长进行扩展。相反,您必须自行在应用程序层实施原生分片集群,或者依赖成本高昂的扩展系统。

文档数据库的优点和缺点是什么?文档数据库有许多优点:

  • 文档模型无处不在、直观且支持快速进行软件开发。
  • 灵活的架构允许数据模型随着应用程序需求的变化而变化。
  • 文档数据库具有丰富的 API 和查询语言,让开发者能够轻松与其数据进行交互。
  • 文档数据库是分布式的(支持水平扩展和全球数据分布)并且具有弹性

这些优势使文档数据库成为通用数据库的绝佳选择。

人们常提到的文档数据库具有一个常见的弱点,那就是许多数据库并不支持多文档 ACID 事务。我们估计,80%-90% 的利用文档模型的应用程序将不需要使用多文档事务

请注意,一些文档数据库(例如 MongoDB)支持多文档 ACID 事务。

访问什么是 ACID 事务?,详细了解文档模型如何在很大程度上消除多文档事务的需求,以及 MongoDB 如何在少数情况下支持事务需求。

文档数据库的有哪些应用场景?

文档数据库是通用数据库,可支持多种事务和分析应用程序场景:

  • 单一视图或数据中心
  • 客户数据管理和个性化
  • 物联网 (IoT) 和时间序列数据
  • 产品目录和内容管理
  • 支付处理
  • 移动应用
  • 大型机分流
  • 运营分析
  • 实时分析

访问应用场景指南:在哪些情况下使用 MongoDB,详细了解关于上面列出的每个应用程序的信息。

总结

文档数据库利用直观、灵活的文档数据模型来存储数据。文档数据库是通用数据库,可用于各种行业 的多种应用场景。

立即开始使用文档数据库,只需在 MongoDB Atlas 中创建数据库即可,这是 MongoDB 的开发者数据平台Atlas 提供一个慷慨的永久免费套餐,您可以用来实验和探索文档模型。

使用 MongoDB Atlas 中的样本数据免费体验文档的强大功能。

常见问题解答

文档型数据库适合应用于哪些领域?

文档数据库是通用数据库,可用于各个行业的多种应用场景。访问在哪些情况下使用 NoSQL,了解更多信息。

MongoDB 是文档数据库吗?

是的,MongoDB 是一个通用文档数据库。

可否提供文档数据库的示例?

MongoDB 是全球最受欢迎的文档数据库。其他文档数据库的示例还包括 CouchDB 和 Firebase。

文档数据库如何工作?

文档数据库将信息存储在文档中。文档数据库具有丰富的 API 和查询语言,可用于执行 CRUD(创建、读取、更新和删除)操作。文档数据库具有灵活的架构,让开发者能够随着应用程序需求的变化轻松调整其数据模型。

文档如何存储在数据库中?

文档数据库将信息存储在文档中。每个文档通常包含关于一个对象及其相关元数据的信息。具有相似内容的文档会分组在集合中。集合组存储在数据库中。

哪个字段始终是文档中的第一个字段?

在 MongoDB 中,每个文档的第一个字段被命名为“id”。“id”字段作为文档的唯一标识符。请参阅 MongoDB 官方文档,了解更多信息。请注意,每个文档数据库管理系统都有各自的字段要求。

MongoDB 数据是如何存储的?

MongoDB 将数据存储在 BSON (二进制 JSON)文档中。

MongoDB 是否可以免费使用?

是的,MongoDB 有两个免费选项:

文档型数据库与关系数据库对比

文档数据库和关系数据库之间最明显的区别是数据建模的方式。文档数据库通常使用灵活的 JSON 类文档和字段-值对来建模数据。关系数据库通常使用具有固定行和列的刚性表格来建模数据。