文档数据库提供了多种优势,包括
由于这些优势,文档数据库是通用数据库,可用于各种用例和行业。
文档数据库被认为是非关系型数据库(或NoSQL数据库)。与存储在固定行和列中的数据不同,文档数据库使用灵活的文档。文档数据库是表格型、关系型数据库的最流行替代品。了解更多关于NoSQL数据库。
在这篇文章中,我们将探讨以下问题的答案
文档是文档数据库中的一个记录。文档通常存储有关一个对象及其相关元数据的信息。
文档以字段值对的形式存储数据。值可以是各种类型和结构,包括字符串、数字、日期、数组或对象。文档可以存储在JSON、BSON和XML等格式中。
以下是一个存储名为Tom的用户信息的JSON文档。
{
"_id": 1,
"first_name": "Tom",
"email": "[email protected]",
"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"
}
}
]
}
集合是一组文档。集合通常存储具有类似内容的文档。
由于文档数据库具有灵活的模式,因此集合中的所有文档不一定需要具有相同的字段。请注意,一些文档数据库提供了模式验证,因此当需要时,模式可以锁定。
以上示例继续,包含有关汤姆信息的文档可以存储在一个名为 users
的集合中。可以添加更多文档到 users
集合中,以便存储其他用户的信息。例如,下面存储有关唐娜信息的文档可以添加到 users
集合中。
{
"_id": 2,
"first_name": "Donna",
"email": "[email protected]",
"spouse": "Joe",
"likes": [
"spas",
"shopping",
"live tweeting"
],
"businesses": [
{
"name": "Castle Realty",
"status": "Thriving",
"date_founded": {
"$date": "2013-11-21T04:00:00Z"
}
}
]
}
请注意,唐娜的文档不包含与汤姆的文档相同的字段。users
集合利用灵活的模式来存储每个用户存在的信息。
文档数据库通常有一个 API 或查询语言,允许开发者执行 CRUD(创建、读取、更新和删除)操作。
文档数据库具有以下关键特性
三个关键因素区分文档数据库和关系数据库
1. 数据模型的直观性:文档映射到代码中的对象,因此它们更容易处理。无需在表之间分解数据,执行昂贵的连接或集成单独的对象关系映射(ORM)层。访问在一起的数据存储在一起,因此开发者需要编写的代码更少,最终用户获得更高的性能。
2. JSON 文档的普遍性:JSON 已经成为数据交换和存储的既定标准。JSON 文档轻量级、语言无关且可读。文档是所有其他数据模型的超集,因此开发者可以以应用程序所需的方式结构化数据——丰富对象、键值对、表、地理空间和时间序列数据,或图中的节点和边。
3. 模式的灵活性:文档的模式是动态的且自我描述的,因此开发者不需要首先在数据库中预定义它。字段可以从文档到文档变化。开发者可以在任何时候修改结构,避免破坏性的模式迁移。一些文档数据库提供模式验证,因此可以选择性地强制执行控制文档结构的规则。
开发者通常认为在文档中处理数据比在表格中处理数据更容易、更直观。文档映射到大多数流行编程语言的数据结构。开发者不必担心在存储时手动将相关数据分割到多个表格中,或在检索时将它们重新组合。他们也不需要使用ORM来处理数据的操作。相反,他们可以直接在应用程序中轻松处理数据。
让我们再来看看一个名为Tom的用户文档。
用户
{
"_id": 1,
"first_name": "Tom",
"email": "[email protected]",
"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的所有信息都存储在一个文档中。
现在让我们考虑如何将相同的信息存储在关系型数据库中。我们将首先创建一个表来存储用户的基本信息。
用户
ID | first_name | cell | |
---|---|---|---|
1 | Tom | [email protected] | 765-555-5555 |
用户可以喜欢许多事物(这意味着用户和喜欢之间存在一对一的关系),因此我们将创建一个名为“Likes”的新表来存储用户的喜好。Likes表将有一个外键,引用Users表中的ID列。
喜好
ID | user_id | like |
---|---|---|
10 | 1 | 时尚 |
11 | 1 | 水疗中心 |
12 | 1 | 购物 |
同样,用户可以经营许多企业,因此我们将创建一个名为“Businesses”的新表来存储企业信息。Businesses表将有一个外键,引用Users表中的ID列。
企业
ID | user_id | name | partner | status | date_founded |
---|---|---|---|---|---|
20 | 1 | Entertainment 1080 | Jean | 破产 | 2011-05-19 |
21 | 1 | Swag for Tweens | NULL | NULL | 2012-11-01 |
在这个简单的例子中,我们可以看到用户数据可以在文档数据库中存储在一个单独的文档中,或者关系型数据库中的三个表中。当开发者在文档数据库中检索或更新用户信息时,他们可以编写一个零连接的查询。与数据库的交互是直接的,并且在数据库中建模数据是直观的。
访问从SQL到MongoDB映射术语和概念了解更多信息。
文档模型是其他数据模型的超集,包括键值对、关系型、对象、图和地理空间。
文档模型是其他数据模型的超集
由于它们强大的数据建模能力,文档数据库是一种通用数据库,可以存储各种用例的数据。
随着文档数据库使开发者能够更快地构建应用程序,大多数关系型数据库已经增加了对JSON的支持。然而,仅仅添加JSON数据类型并不能带来对JSON有原生支持的数据库的好处。为什么?因为关系型方法会降低开发者生产力,而不是提高它。以下是开发者必须处理的一些问题。
与文档一起工作意味着使用定制的、供应商特定的SQL函数,这些函数对大多数开发者来说不熟悉,并且无法与您最喜欢的SQL工具一起工作。添加低级JDBC/ODBC驱动程序和ORM,您将面临复杂的发展过程,导致低生产力。
将JSON数据呈现为简单的字符串和数字,而不是像MongoDB这样的原生文档数据库所支持的丰富数据类型,使得计算、比较和排序数据变得复杂且容易出错。
关系型数据库在验证文档模式方面提供的支持很少,因此您无法对您的JSON数据应用质量控制。并且,您仍然需要为您的常规表格数据定义一个模式,当您的应用程序功能发展时,需要更改表格时,将涉及所有额外的开销。
大多数关系型数据库不维护JSON数据的统计信息,阻止查询计划器针对文档优化查询,以及您调整查询。
传统的数据库关系型数据库没有提供一种方法来在多个实例之间分区(分片)数据库,以随着工作负载的增长而扩展。相反,您必须自己在应用程序层实现分片,或者依赖昂贵的扩展系统。
文档数据库有许多优点
这些优点使文档数据库成为通用数据库的优秀选择。
关于文档数据库的常见弱点是许多不支持多文档ACID事务。我们估计,80%-90% 的利用文档模型的应用程序将不需要使用多文档事务。
请注意,一些文档数据库,如MongoDB支持多文档ACID事务。
访问什么是ACID事务?了解更多关于文档模型如何主要消除多文档事务的需求以及MongoDB如何在需要时支持事务的信息。
文档数据库是通用数据库,适用于事务型和分析应用程序的多种用例。
访问使用案例指南:在哪里使用MongoDB了解有关上述每个应用程序的更多信息。
文档数据库利用直观灵活的文档数据模型来存储数据。文档数据库是一种通用数据库,可用于各行各业的各种用例。
通过在MongoDB Atlas中创建数据库来开始使用文档数据库,MongoDB的开发者数据平台。Atlas提供慷慨的永久免费层,您可以使用它来实验和探索文档模型。
在MongoDB中,每个文档的第一个字段命名为_id
。该_id
字段充当文档的唯一标识符。有关更多信息,请参阅官方MongoDB文档。
请注意,每个文档数据库管理系统都有自己的字段要求。
MongoDB使用BSON(二进制JSON)文档存储数据。
是的,MongoDB有两个免费选项
文档数据库与关系数据库之间最明显的区别是数据建模的方式。文档数据库通常使用灵活的类似JSON的文档,其中包含字段-值对来建模数据。关系数据库通常使用具有固定行和列的刚性表来建模数据。