MongoDB 简化教程 第一部分:是什么、为什么以及如何使用?
这是“MongoDB入门指南”系列文章的第一篇,将涵盖MongoDB的所有基础知识。我会尽量用最简单的方式来讲解。
我们将从了解什么是 MongoDB?它是如何工作的?它的优缺点是什么?如何在你的机器上进行配置?一直到学习如何执行基本的 CRUD 操作。如果你好奇的话,CRUD 是创建(Create)、读取(Read)、更新(Update)和删除(Delete)的缩写。那么,让我们开始吧。
MongoDB是什么?
MongoDB 是一个基于文档模型的数据库,它是一种非关系型数据库。
那么,关系型数据库和非关系型数据库分别是什么呢?🤔
假设关系数据库管理系统(RDBMS)就像一个“Excel 表格”,它有行和列,用于以表格的形式保存数据。每个表格都有一个唯一的 ID 来标识每一行,并且每一列都分布着多个字段。这类数据库通常彼此之间存在关系,因此得名“关系数据库” 💡。
MongoDB (数据库管理系统)将数据以类似 JSON 的文档形式保存在集合中,这些文档与其他文档之间没有任何关联,因此被称为“非关系型数据库”。JSON对象示例如下所示👇🏼:
{
"id": "123",
"name": "Shad Mirza",
"hobbies": "Coding, Art, Writing"
}
它是如何运作的?
MongoDB 中的记录就是一个文档。那么,什么是文档呢?🤔
文档是一种由字段和值对组成的数据结构。MongoDB 文档类似于JSON 对象 (参见上面的示例),但它使用一种称为BSON(二进制 JSON)的变体,可以容纳更多数据类型。这些文档是单独插入的,彼此之间互不感知。(记住,这是非关系型数据库。)
这意味着记录的列数不必相同(这是关系数据库管理系统中的必须条件)。
例如:一个集合Employees可以包含多个文档,每个文档employee可以有不同的号码对数量,key-value例如,一个员工可以有一个电话号码,而另一个员工可以有两个电话号码,这完全没问题。
{
"id": "101",
"name": "Ramesh",
"personalNumber": "9123456789"
},
{
"id": "102",
"name": "Suresh",
"personalNumber": "9123456788",
"workNumber": "8123456789",
}
现在假设我们使用的是关系型数据库,那么我们必然会为每组数据使用相同数量的列。
在当前示例中,这意味着我们需要workNumber为所有员工添加一列,无论他们是否需要此字段。这将导致“Ramesh”在workNumber该列中出现空值😓。
不受列的限制,开发人员可以随意添加文档,而不用担心稍作更改就会破坏一切🤩。
MongoDB允许您以计算机易于处理且人类易于阅读的方式构建数据,从而为整个应用程序提供存储和处理数据的自然方式。
MongoDB 是一个分布式数据库,这意味着它提供了三个基本功能,开发者需要自行实现这些功能。正因如此,它深受开发者社区的喜爱。这三个功能是:
- 容错性:MongoDB允许数据拥有多个副本,因此即使某个服务器发生故障,其他服务器也能继续提供数据。单个服务器故障不会影响应用程序,因为始终有多个副本可供依赖。它采用单主架构来保证数据一致性,辅助数据库则维护主数据库的副本。
- 可扩展性: MongoDB 可以跨多个服务器扩展以存储和处理数据。因此,随着数据量和性能的增长,您只需添加更多服务器,而无需升级大型机。
- 数据可用性:您可以将数据传输到全球各地,以获得更快的处理速度。
了解 NoSQL 和 SQL
关于 SQL 与 NoSQL 孰优孰劣的争论已经爆发了无数次战争⚔️,但答案始终如一:“视情况而定”。
让我们从基础说起。数据库的专属用途是什么? 🤔
“存储数据”对吧?现在,让我们在这个背景下了解一下 SQL 数据库和 NoSQL 数据库之间的区别,以及它们如何存储数据。
SQL
- 结构:
tablesSQL 以包含rows和的形式存储数据columns。它结构良好,并且由于 SQL 是关系型数据库,因此不同表之间通常存在一些关系(主键、外键等)。 - 速度:由于这些关系和*定义良好的*结构,SQL避免了数据重复,并且在连接、查询、更新等操作上速度相对较快。听起来不错吧?但是等等……
- 灵活性:这也意味着您需要提前规划结构,任何更改都会很困难(记住关系?表是相互连接的。您不能只更改一个而不考虑另一个)。
- 大数据:由于需要在多个位置应用更改,并且数据被拆分成多个逻辑表(我们稍后会详细介绍),因此需要对多个表执行各种读取操作才能获取所需数据。大数据要求数据读写查询速度尽可能快,因此 SQL 可能并非最佳选择。尽管 SQL 数据库在大规模部署中仍然适用,因为……
- 社区: SQL 是一项成熟的技术,它已经存在很长时间了,有很多经验丰富的开发人员非常了解它。这意味着您可以获得强大的支持,如果您遇到任何问题,肯定能找到帮助。此外,您还可以轻松找到许多独立顾问,他们可以帮助您部署大规模 SQL 数据库。
- 可扩展性: SQL 数据库几乎在所有情况下都具有可扩展性
vertically scalable。这意味着您可以通过增加内存、CPU 或 SSD 等资源来提高单个服务器的负载。它非常强大,并且已被证明可以处理几乎任何情况。它遵循ACID特性(原子性、一致性、隔离性和持久性)。
例子
员工表格:
| 员工编号 | 员工姓名 | 数字 | 工作编号 | 地址 |
|---|---|---|---|---|
| 1 | 沙德 | 9988776655 | 9876543210 | 121 |
| 2 | 瓦姆西 | 8877665544 | 无效的 | 122 |
| 3 | 吉里什 | 7766554433 | 无效的 | 123 |
地址表:
| 地址 ID | 城市 | 国家 | 邮政编码 |
|---|---|---|---|
| 121 | 瓦拉纳西 | 印度 | 221000 |
| 122 | 德里 | 印度 | 212345 |
| 123 | 胡布利 | 印度 | 564635 |
🧐 这个例子中有几点需要注意:
FOREIGN KEY这两个表通过列中的键相互关联address。该键可用作 ID 来引用地址表。- SQL 遵循一定的结构,因此
work_number无论我们是否需要(对于特定行),该列都是必需的(请查看第二行和第三行的空值)。 - 要读取有关员工的信息,我们必须查询
employee表,然后再address查询表,或者我们必须先将这两个表连接起来,然后获取数据。
NoSQL
- 结构: NoSQL 数据库以文档模型的形式,将数据存储在类似 JSON 的对象中,这些对象包含
key-value键值对。NoSQL 数据库没有标准模式定义,集合之间也没有关联。您可以将数据块合并在一起,而无需拆分它们。 - 速度:正因如此,您可以一次性插入和检索所有数据。此外,NoSQL 数据库专为非结构化数据而设计。特定的数据实体存储在一起,而不是进行分区。因此,与 SQL 数据库相比,NoSQL 数据库对单个数据实体执行读取或写入操作的速度更快。
- 灵活性:动态模式允许 MySQL 数据库根据用户需求进行更改。它们彼此独立,因此您无需担心在添加新内容时会破坏现有系统。
- 大数据:由于模式灵活且读写查询速度更快,NoSQL 最适合大数据应用。
- 社区: NoSQL 相对较新,支持力度不如 SQL,但发展速度很快。此外,能够搭建和部署大规模 NoSQL 系统的外部专家也比较有限。
- 可扩展性: NoSQL 数据库具有良好的可扩展性
horizontally scalable。这意味着可以通过添加更多服务器来处理更多流量。NoSQL 数据库遵循Brewers CAP 定理(一致性、可用性和分区容错性),但最新版本也引入了 ACID 特性。
例子
{
"_id": "1",
"employeeName": "Shad",
"number": "9988776655",
"workNumber": "9876543210",
"address": {
"city": "Varanasi",
"country": "India",
"pincode": "221000"
},
},
{
"_id": "2",
"employeeName": "Vamsi",
"number": "8877665544",
"address": {
"city": "Delhi",
"country": "India",
"pincode": "212345"
},
},
{
"_id": "3",
"employeeName": "Girish",
"number": "7766554433",
"address": {
"city": "hubli",
"country": "India",
"pincode": "564635"
},
"techStack": [
{
"_id": "565",
"tech": "React",
"experience": "3 Years",
},
{
"_id": "867",
"tech": "MobX",
"experience": "2 Years",
},
]
},
🧐 这个例子中有几点需要注意:
- 集合中不同对象之间没有关联。我们可以随意添加新的
key-value对象对。(在 SQL 中添加新列时,我们需要处理之前添加的所有行,这些行对于新添加的字段将被赋值为 null。) - 集合不需要包含特定数量的值。第二个和第三个对象不需要值
workNumber,所以我们根本不保存它们,也不包含空值。 - 我们最终需要一次性获取所有用户信息(包括),我们可以将它们一起保存
address,从而通过一次 API 调用轻松获取这些信息。 - 将 JSON 数据当作对象来存储,可以让我们更轻松地存储复杂的结构。例如,我们最后一条记录就把“techStack”存储在一个对象数组里😵。这种灵活性在需要快速搭建原型时非常实用。
优点和缺点
MongoDB并非关系型数据库的替代品,而是一种替代方案。两者各有优缺点,我们必须了解何时使用哪种数据库。
现在我们要明确一下“视情况而定”的争论。让我们来分析一下利弊,以便更好地理解这个问题。
优点🥳
- 数据存储在单个JSON对象中,插入和检索都很容易。
- 无需存储
NULL值:每个 JSON 对象都是独立的。 - 灵活的模式:假设您想在 Person 表中添加一列。在 SQL 数据库中添加新数据需要进行一些更改,例如回填数据、修改模式等。这意味着所有已插入的值都会受到影响。但在 NoSQL 中,由于无需任何预先步骤,您可以轻松插入新数据。旧集合并不知道新的 JSON 对象,因此您可以立即开始添加新字段。
- 为规模化而构建:NoSQL 数据库严格遵循 Brewers CAP 定理(一致性、可用性和分区容错性)。
- 专为数据聚合而设计:我们可以收集平均工资、最高年龄等智能数据。
缺点😓
- 如果您要执行大量更新操作(例如,先执行 DELETE 再执行 INSERT),则这不是一个好的选择。
- NoSQL 的设计初衷是可扩展性,这意味着你可以高效地存储大量数据,但它并不适合复杂的查询。当然,你可以使用 NoSQL 来处理繁重的事务。然而,它并非最佳选择。(MongoDB 最近发布了 4.2.0 新版本,承诺提供安全的事务,因此这一点未来可能会得到解决,让我们拭目以待。)
- JOIN 操作比较复杂。如果要从两个不同的集合中获取匹配的数据,则必须手动合并和检索数据。而 SQL(由于表之间的关系)内置了对 JOIN 的支持。
- SQL 是一项成熟的技术,这意味着它值得信赖,已被广泛应用于各种场景,并拥有庞大的社区支持。如果您遇到问题,很可能能够找到解决方案;而 NoSQL 则相对较新。
本文到此结束,希望对您有所帮助。下一部分,我们将学习如何在本地机器上安装 MongoDB 并开始使用它。在那之前,请保重 👋,戴好口罩,祝您编程愉快!😋
Shad