MongoDB 一个基于分布式文件存储的数据库 (一)
MongoDB 一个基于分布式文件存储的数据库 (一)
MongoDB[2]
是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。[3]
一、MongoDB介绍
1.1 历史
在2007年的后期,Dwight Merriman,艾略特霍洛维茨和他们的团队决定开发一个在线的网站服务。该服务的目的是为开发、托管和自动伸缩网络提供一个平台。应用程序,与谷歌应用引擎或微软Azure等产品有很大的合作。很快他们认识到没有任何开放源码数据库平台适合于服务的需求。我们觉得很多现有的数据库并没有真正的“云计算”原则它们具有:弹性、可伸缩性和……易于管理,但也易于使用。
1.2 MongoDB的设计原则
1.2.1 高速、可扩展性和敏捷性
设计团队在设计MongoDB时的目标是创建一个快速、大规模可扩展的数据库,和容易使用。为了在分区数据库中实现速度和水平的可伸缩性,上限定理,一致性和事务支持必须被妥协。因此,每这个定理,MongoDB提供了高可用性、可伸缩性和分区,以达到一致性和事务性的成本。支持。在实际操作中,这意味着,MongoDB不是使用表和行,而是使用文档来实现它。灵活、可伸缩、快。
1.2.2 非关系型方法
传统的RDBMS平台使用扩展方法提供可伸缩性,这需要更快的服务器提高性能。RDBMS系统中的下列问题导致了MongoDB和其他NoSQL的原因数据库是按照设计的方式设计的:
● 为了进行扩展,RDBMS数据库需要将可用的数据连接起来或者更多的系统来报告结果。这是很难做到的RDBMS系统在所有数据可用时都被设计成可以工作的一起计算。因此,数据必须可用于单个处理的位置。
● 在多个主动活动服务器的情况下,当两者都得到更新时在确定哪个更新是正确的方面,多个源是一个挑战。
● 当应用程序试图从第二个服务器读取数据和信息时已经在第一个服务器上进行了更新,但是还没有与第二个服务器同步服务器,返回的信息可能已经过时了。
MongoDB团队决定采用一种非关系型的方法来解决这些问题。作为MongoDB将其数据存储在BSON文档中,其中所有相关数据都放在一起,这意味着一切都在一个地方。MongoDB中的查询基于文档中的键,所以文档可以跨多个服务器传播。查询每个服务器意味着它将检查自己的一组文档并返回结果。这支持线性可伸缩性和提高性能。
MongoDB有一个主次复制,其中主接受写请求。如果编写性能需要改进,然后可以使用分片;这将跨多个数据分割机器并使这些多台机器能够更新数据集的不同部分。切分是在MongoDB自动;随着更多的机器被添加,数据被自动地分发。
1.2.3 基于JSON的文档存储
MongoDB使用基于json的(JavaScript对象标记)文档存储为数据。JSON / BSON提供一个无模式的模型,它在数据库设计方面提供了灵活性。与RDBMSs不同,更改可以对模式进行无缝的处理。
该设计还通过提供相关数据的分组来实现高性能。在内部,让它易于搜索。
JSON文档包含实际的数据,并且与SQL中的一行相当。然而,形成鲜明对比RDBMS行,文档可以有动态模式。这意味着集合中的文档可以不同的字段或结构,或公共字段可以有不同类型的数据。
一个文档以键值对的形式包含数据。让我们用一个例子来理解这个问题:
正如前面提到的,键和值是成对出现的。文档中一个键的值可以是空的。在上面的示例中,文档有三个键,即“Name”、“Phone”和“传真”。“传真”键
没有价值。
1.2.4 性能和功能对比
为了使MongoDB具有高性能和快速的特性,RDBMS中常用的一些特性系统在MongoDB中是不可用的。MongoDB是一种面向文档的DBMS,数据存储在其中文档。它不支持连接,也不具有完全通用的事务。然而,它确实为辅助索引提供支持,它允许用户查询使用查询文档,并且提供支持每个文档级别的原子更新。它提供了一个副本集,这是主从的一种形式具有自动故障转移的复制,并且具有内置的水平扩展。
1.2.5 随处都能运行数据库
主要的设计决策之一是能够从任何地方运行数据库,这意味着它应该能够在服务器、虚拟机、甚至云计算上运行,使用“按你付费”的服务。的语言
用于实现MongoDB的是C++,它使MongoDB能够实现这一目标。10 gen网站为不同的操作系统平台提供二进制文件,使MongoDB能够在几乎任何类型的机器上运行。
下面是MongoDB与SQL的不同之处。
1。MongoDB使用文档来存储它的数据,它提供了一个灵活的模式(相同集合中的文档可以有不同的字段)。这使用户能够存储嵌套或多值字段,如数组、散列等。相反,RDBMS系统提供一个固定的模式,其中列的值应该具有类似的数据类型。同样,在单元格中存储数组或嵌套值是不可能的。
2。MongoDB没有提供对连接操作的支持,比如SQL。但是,它使用户能够将所有相关的数据存储在一个文档中,避免在外围使用连接。它有一个解决这个问题的方法。我们将在后面的章节中更详细地讨论这个问题。
3。MongoDB不像SQL那样提供对事务的支持。但是,它保证了文档级别的原子性。另外,它使用隔离操作符隔离影响多个文档的写操作,但它确实如此
二、MongoDB的数据结构
2.1 数据模型
MongoDB是一个基于文档的数据库系统,其中有文档可以有一个灵活的模式。这意味着集合中的文档可以有不同(或相同)集的字段。这在处理数据时提供了更大的灵活性
在本章中,您将探索MongoDB的灵活数据模型。哪里有需要,我们将与RDBMS系统相比,演示了这种方法的区别。
MongoDB部署可以有许多数据库。每个数据库都是一组集合。集合类似于SQL中的表的概念;然而,他们是无模式。每个集合都可以有多个文档。可以将文档看作是SQL中的一行。图4-1描述了MongoDB数据库模型。
在RDBMS系统中,因为每个列的表结构和数据类型都是固定的,所以可以只在列中添加特定数据类型的数据。在MongoDB中,集合是文档的集合将数据存储为键-值对。
让我们以一个示例来理解数据是如何存储在文档中的。下面的文档包含以下内容用户的姓名和电话号码:
动态模式意味着同一集合中的文档可以具有相同或不同的集合在字段或结构中,甚至公共字段都可以在文档中存储不同类型的值。有数据存储在一个集合的文档中的方式是不严格的。
因此,一个集合的文档可以有完全不同的模式。它会落到应用程序来存储一个特定集合中的文档或多个集合。
1.2.1 JSON和BSON
MongoDB是一个基于文档的数据库。它使用二进制JSON存储数据。
在本节中,您将了解JSON和二进制-JSON(BSON)。JSON代表JavaScript对象符号。在当今的现代Web(以及XML)中,它是用于数据交换的标准。的格式是人类和机器可读的。这不仅是交换数据的好方法,也是存储数据的好方法。
所有的基本数据类型(例如字符串、数字、布尔值和数组)都是由JSON支持的。
下面的代码显示了JSON文档的样子:
JSON使您可以将所有相关的信息集中在一个地方,这提供了优秀的信息的性能。它还使文档的更新成为独立的。它是无模式。
MongoDB以二进制编码的格式存储JSON文档。这被称为“BSON”。BSON数据模型是JSON数据模型的扩展形式。MongoDB的一个BSON文档的实现是快速的、可实现的,并且是轻量级的。它支持在其他数组中嵌入数组和对象,并允许MongoDB进入对象内部在顶级和嵌套的BSON键上构建索引并匹配对象。
1.2.2 标识符(_id)
您已经看到MongoDB将数据存储在文档中。文档是由键值对组成的。尽管可以将文档与RDBMS中的一行进行比较,但与一行不同,文档具有灵活的模式。一个键,它仅仅是一个标签,可以粗略地与RDBMS中的列名相比较。使用一个关键用于从文档中查询数据。因此,就像RDBMS主键(用于惟一地标识每个键行),您需要有一个键,它惟一地标识一个集合中的每个文档。这被称为在MongoDB
_id。
如果您没有显式地为键指定任何值,那么将自动生成一个惟一的值并由MongoDB分配给它。这个键值是不可变的,除了数组之外,它可以是任何数据类型。
1.2.3 固定集合
您现在已经精通了集合和文档。让我们来讨论一种特殊的集合叫做a限制收集
MongoDB有一个限制集合的概念。这意味着它将文档存储在集合中在插入的顺序。当集合达到其极限时,文档将从集合中删除。在FIFO(首先是,先出)订单。这意味着,最近插入的文档将首先被删除。
这对于需要自动维护插入顺序的用例来说是很好的,并且需要在固定大小的情况下删除记录。一个这样的用例是自动生成的日志文件在一定大小后截断。
2.2 多态模式
由于您已经熟悉MongoDB数据结构的无模式特性,现在让我们来探索一下多态模式和用例。
多态模式是一个模式,其中一个集合拥有不同类型或模式的文档。这个模式的一个很好的例子是一个名为Users的集合。一些用户文档可能会有额外的传真数字或电子邮件地址,而其他人可能只有电话号码,但所有这些文档都是共存的在相同的用户集合中。这个模式通常被称为多态模式。
1.2.1 面向对象编程
面向对象编程使您可以使用继承来让类共享数据和行为。它还允许在父类中定义函数,这些函数可以在子类中被覆盖,这样就可以在不同的环境下,函数是不同的。换句话说,您可以使用相同的函数名来操作除了父类,子元素和父类都是不同的。这特性被称为多态性。
在本例中,需求是具有一个模式,其中包括所有相关的对象集合层次结构中的对象可以组合在一起,也可以被相同的检索。
让我们考虑一个例子。假设您有一个允许用户上传和共享的应用程序不同的内容类型,如HTML页面、文档、图像、视频等等。在上述所有内容类型中都是常见的(例如名称、ID、作者、上传日期,以及时间),不是所有的字段都是相同的。例如,在图像的情况下,你有一个二进制字段图像内容,而HTML页面有一个大的文本字段来存放HTML内容。
在此场景中,可以使用MongoDB多态模式,其中所有内容节点类型都可以使用存储在相同的集合中,例如LoadContent,并且每个文档只有相关的字段。
这个模式不仅允许您将具有不同结构的相关数据存储在相同的结构中集合,它也简化了查询。相同的集合可以用于执行常见的查询诸如获取某个特定日期和时间上上传到的所有内容以及特定字段的查询等字段例如查找大小大于X
MB的图像。因此,面向对象编程是拥有多态模式的用例之一。是有意义的。
1.2.2 模式演化
当您使用数据库时,您需要考虑的最重要的考虑事项之一因为模式的演化(例如,模式对正在运行的应用程序的影响)。设计应该在某种程度上对应用程序进行最小或不影响,这意味着没有或最小限度停机时间、不或非常小的代码更改等等。
通常情况下,模式演化是通过执行一个迁移脚本来实现的,该脚本将数据库模式从旧版本升级到新版本。如果数据库不在生产环境中,脚本可以简单地删除和重新使用数据库。但是,如果数据库位于生产环境中,并且包含实时数据,那么迁移脚本将是复杂的,因为需要保存数据。脚本应该考虑这个问题。尽管MongoDB提供了一个更新选项,可用于更新集合中的所有文档结构,如果有一个字段的新添加,请想象如果在集合中有数千个文档,那么做这件事的影响。它将非常缓慢,并且会对底层应用程序的性能产生负面影响。这样做的一种方法是将新结构添加到新文档中,并将这些文档添加到集合中,然后在应用程序仍在运行时逐渐将其迁移到后台。这是许多用例中的一个,其中多态模式将是有利的。
About Me:
Github地址:https://github.com/noseparte
Email:[email protected] 有java与hadoop相关的技术问题,可以发私信与我交流。
NPM地址:https://www.npmjs.com/~noseparte
个人网站 : http://www.noseparte.com/ Copyright © 2017 noseparte