了解MongoDB:面向文档的NoSQL数据库的优势

1,030 阅读13分钟

简介

近年来,数据已经成为技术的驱动力,因为现代应用和网站需要管理不断增加的数据量。传统上,数据库管理系统是基于关系模型来组织数据的。然而,随着组织的数据需求的变化,一些新类型的数据库已经被开发出来。

这些新类型的数据库通常不依赖于关系型数据库提供的传统表结构,因此可以比关系型数据库强加的刚性结构有更大的灵活性。此外,它们通常不使用_结构化查询语言_(SQL),而大多数关系型数据库系统采用_结构化查询语言_来允许用户定义和与数据互动。这导致许多这些新的非关系型数据库被普遍称为NoSQL数据库。

MongoDB--也被称为_Mongo_--于2009年首次发布,是一个面向文档的NoSQL数据库,用于许多现代网络应用。这篇概念性文章高屋建瓴地介绍了MongoDB区别于其他数据库管理系统的特点,并使其成为许多不同用例中的宝贵工具。

MongoDB的简要概述

正如介绍中提到的,MongoDB被认为是一个NoSQL数据库,因为它不依赖于关系模型。每个数据库管理系统都是围绕某种类型的数据模型设计的,该模型定义了数据库内的数据将如何被组织。关系模型涉及将数据存储在由行和列组成的表格中--更正式地称为_关系_。

另一方面,MongoDB将其数据记录存储在被称为_文档_的结构中。 Mongo允许你将多个文档分组到一个被称为_集合_的结构中,这些集合可以进一步被分组到单独的_数据库_中。

文档是用BSON写的,是JSON的二进制表示。像JSON中的对象一样,MongoDB文档以大括号({} )开始和结束,并包含一些字段和值对,通常采用以下形式 field: value.一个字段的值可以是BSON中使用的任何一种数据类型,甚至是其他结构,如文档和数组。

安全性

MongoDB安装了许多功能,可以帮助防止数据丢失以及未授权用户的访问。这些功能中的一些可以在其他数据库管理系统中找到。例如,Mongo和许多现代数据库管理系统一样,允许你在数据穿越网络时对其进行加密--有时称为_传输中的数据_。它通过要求使用_传输层安全_(TLS)连接到数据库,这是一种加密协议,作为_安全套接字层_(SSL)的继承者。

与其他数据库管理系统一样,Mongo通过一个被称为_基于角色的访问控制_(RBAC)的计算机安全概念来管理_授权_--为一个给定的用户或用户组设置规则,以定义他们可以执行哪些操作,可以访问哪些资源。每当你创建一个MongoDB用户时,你可以选择为他们提供一个或多个_角色_。

角色定义了用户所拥有的权限,包括他们可以在一个给定的数据库、集合、集合集或集群上执行什么操作。例如,你可以在任何数据库上为用户分配readWrite 角色,这意味着只要你授予用户readWrite 角色,你就可以读取和修改系统中任何数据库的数据。MongoDB的RBAC区别于其他数据库的地方在于,除了内置的角色,Mongo还允许你定义自定义的角色,让你更多地控制用户可以访问系统中的哪些资源。

自4.2版本发布以来,MongoDB支持_客户端字段级加密_。这涉及到在数据被写入数据库之前对文档中的某些字段进行加密。任何客户端或应用程序在以后试图读取它时,必须首先提出正确的加密密钥,以便能够解密这些字段中的数据。

为了说明这一点,假设你的数据库持有一个具有以下字段和值的文档。

{
  "name" : "Sammy",
  "phone" : "555-555-1234",
  "creditcard" : "1234567890123456"
}

在现实世界的应用中,存储这样的敏感信息--即一个人的电话和信用卡号码--可能是危险的。即使你对谁可以访问数据库进行了限制,任何有权限访问数据库的人都可以看到并利用你用户的敏感信息。不过,如果配置得当,这些字段看起来就像用客户端字段级加密编写的一样。

{
  "name" : "Sammy",
  "phone" : BinData6,"quas+eG4chuolau6ahq=i8ahqui0otaek7phe+Miexoo"),
  "creditcard" : BinData6,"rau0Teez=iju4As9Eeyiu+h4coht=ukae8ahFah4aRo="),
}

对于MongoDB的安全特性的更全面的概述,以及一些保持Mongo数据库安全的一般策略,我们鼓励你查看我们的MongoDB安全系列。保持数据安全的最佳做法

灵活性

MongoDB的另一个有助于推动其采用的特点是,与更传统的数据库管理系统相比,它提供了灵活性。这种灵活性源于MongoDB基于文档的设计,因为Mongo中的集合并不强制执行其中每个文档必须遵循的特定结构。这与关系型数据库中的表所强加的僵硬结构形成了对比。

每当你在关系型数据库中创建一个表时,你必须明确定义该表将容纳的列及其数据类型。之后,你添加的每一行数据都必须符合该特定结构。另一方面,同一集合中的MongoDB文档可以有不同的字段,即使它们共享一个给定的字段,也可以在不同的文档中持有不同的数据类型。

这种由关系模型强加的僵化并不一定是件坏事。事实上,它使得关系型数据库在存储整齐地符合预定结构的数据时相当有用。但是,在你需要存储_非结构化数据_的情况下,它就会变得很有局限性--这些数据不容易适合预定义的数据模型,或者不容易被传统工具搜索到。

非结构化数据的例子包括媒体内容,如视频或照片,通信数据,或文本文件。有时,非结构化数据被概括为定性数据。换句话说,这些数据可能是人类可读的,但计算机难以充分解析的。然而,MongoDB的多功能面向文档的设计,使其成为存储和分析非结构化数据以及结构化和半结构化数据的最佳选择。

Mongo灵活性的另一个例子是它提供了多种与数据交互的途径。例如,你可以运行mongo shell,这是一个基于JavaScript的界面,与MongoDB服务器一起安装,它允许你从命令行与你的数据互动。

Mongo还支持一些官方驱动,可以帮助你将数据库连接到你的应用程序。Mongo为各种流行的编程语言提供这些库,包括PHP、Java、JavaScript和Python。这些驱动程序还提供了对各自主机语言中的数据类型的支持,扩展了默认的BSON数据类型。

高可用性

任何基于计算机的数据库系统都依赖于它的底层硬件,以满足应用程序或客户端的需求。如果运行该系统的机器因任何原因发生故障,在机器重新启动和运行之前,数据库中的数据将无法访问。如果一个数据库管理系统能够在超过正常时间的情况下保持运行,那么它就被认为是 高度可用.

许多数据库保持高度可用的一种方式是通过一种被称为_复制_的做法。复制包括在不同机器上运行的多个不同数据库之间同步数据。这导致相同数据的多个副本,并在其中一个数据库服务器发生故障时提供冗余。这确保了同步的数据始终对依赖它的应用程序或客户端保持可用。

在MongoDB中,一组通过复制维护相同数据集的服务器被称为. 复制集.作为某个复制集的一部分,MongoDB的每个运行实例被称为其_成员_之一。每个复制集必须有一个_主要成员_和至少一个_辅助成员_。

与其他数据库系统的复制实现相比,MongoDB的复制集的一个优势是Mongo的自动故障转移机制。在主要成员变得不可用的情况下,一个自动的选举过程会在次要节点中发生,以选择一个新的主要成员。

可扩展性

作为现代应用程序的核心组成部分,数据库必须能够对其必须执行的工作量的变化做出反应,这一点很重要。毕竟,一个应用程序可以看到其用户数量的突然激增,或者可能经历特别繁重的工作负荷的时期。

可扩展性_是指计算机系统处理不断增长的工作量的能力,而增加这种能力的做法被称为_扩展。有两种方法可以扩展计算机系统。

  • 垂直扩展--也被称为_向上扩展_--包括向一个给定的系统添加更多的计算资源,通常是通过增加其存储容量或内存。
  • 横向扩展--也被称为_扩展_--包括将工作负载分割到多个计算节点上,这些节点共同组成一个逻辑系统。

要纵向扩展MongoDB数据库,可以备份其数据并将其迁移到另一台具有更多计算资源的机器上。这通常是垂直扩展任何数据库管理系统的相同程序,包括关系型数据库。然而,像这样的扩展会有缺点。随着时间的推移,使用越来越大的机器的成本可能会变得非常昂贵,而且,无论多么伟大,单台机器可以存储多少数据,总是有一个上限。

分片_是一些管理员为扩大数据库规模而采用的策略。如果你想彻底了解分片的情况,我们鼓励你阅读我们的概念性文章《理解数据库分片》。不过,为了本文的目的,请理解分片是根据一组给定的规则分割数据集的过程,并将产生的数据块分布在多个独立的数据库节点上。持有分片集群的部分数据集的单一节点被称为_分片

数据库管理系统并不总是将分片功能作为一项内置功能,因此分片通常是在应用层面实现的。然而,MongoDB确实包括一个内置的分片功能,允许你在集合层面上分片数据。从3.6版本开始,MongoDB的每个分片都必须作为一个副本集部署,以确保分片的数据保持高度可用。

要在Mongo中分片数据,你必须在一个给定的集合的文档中选择一个或多个字段作为_分片密钥_。然后,MongoDB将分片键值的范围划分为不重叠的范围,称为_分片_,每个分片被分配到一个特定的分片。

之后,Mongo读取每个文档的shard key值,确定该文档属于哪个chunk,然后将该文档分配到适当的shard。MongoDB积极监测每个分片中的块的数量,并将尝试把块从一个分片迁移到另一个分片,以确保每个分片有相同的数量。

分片的主要缺点是,它给数据库系统增加了一定程度的操作复杂性。然而,一旦你有一个工作的MongoDB分片集群,添加更多的分片以横向扩展系统的过程是相当简单的,一个正确配置的复制集可以通过一个命令被添加为分片。这使得MongoDB成为需要快速扩展的应用程序的一个有吸引力的选择。

MongoDB适合我的应用吗?

相对于采用NoSQL模型的数据库,关系型数据库管理系统的使用范围仍然很广。尽管如此,由于本指南中所描述的功能,MongoDB继续获得了发展。特别是,它已经成为一些使用案例的数据库的共同选择。

例如,它的扩展能力和高可用性使它成为电子商务和游戏应用的流行数据库,在这些应用中,被服务的用户数量可以快速和急剧增加。同样,它灵活的模式和处理大量非结构化数据的能力使它成为内容管理应用的最佳选择,这些应用需要管理不断变化的资产目录,从文本到视频、图像和音频文件。由于它强大的扩展性和数据分析能力,它在移动应用开发者中也得到了强有力的采用。

当决定你是否应该在你的下一个应用程序中使用MongoDB时,你应该首先问自己应用程序的具体数据需求是什么。如果你的应用程序将存储严格遵守预定义结构的数据,你可能不会从Mongo的无模式设计中获得多少额外的价值,你可能最好使用关系型数据库。

然后,权衡一下你期望你的应用程序需要存储和使用多少数据。MongoDB的面向文档的设计使它成为需要存储大量非结构化数据的应用程序的最佳选择。同样,MongoDB的可扩展性和高可用性使其成为服务于大量和不断增长的客户的应用程序的完美选择。然而,这些功能在数据密集度不高的情况下可能会过度。

总结

通过阅读这篇文章,你会对MongoDB区别于其他数据库管理系统的特点有了更好的了解。尽管MongoDB是一个强大、灵活和安全的数据库管理系统,在某些使用情况下可以成为数据库的正确选择,但它不一定是最佳选择。虽然它基于文档和无模式的设计可能不会很快取代关系型数据库模型,但Mongo的快速增长突出了它作为一个值得了解的工具的价值。

关于MongoDB的更多信息,我们鼓励你查看DigitalOcean的整个MongoDB内容库。此外,MongoDB的官方文档也是与Mongo合作的宝贵信息资源。