为了产品中的某个实体的查询操作,我们需要把一个本属于该实体的数据拆分至另一个表中,以便进行连接查询。于是无论是创建,删除还是更新,我们要涉及的操作便增加了许多。更别说互联网项目时刻都在发展和变动,改变一个存储单元结果是常事,至今关系型数据库的在线模式更新依旧不是件简单的事情。这是mongodb出现的必要性。
一、简介
mongoDB是一个开源的,基于分布式的,面向文档存储的非关系型数据库。是非关系型数据库当中功能最丰富、最像关系数据库的。
mongoDB由C++编写,其名字来源于"humongous"这个单词,其宗旨在于处理大量数据。
mongoDB可以运行在Windows、unix、OSX、Solaris系统上,支持32位和64位应用,提供多种编程语言的驱动程序。
mongoDB支持的数据结构非常松散,是类似json的BSON格式,通过键值对的形式存储数据,可以存储复杂的数据类型。
mongoDB支持的数据类型有:null、boolean、String、objectId、32位整数、64位整数、64位浮点数、日期、正则表达式、js代码、二进制数据、数组、内嵌文档、最大值、最小值、未定义类型。
其中,内嵌文档我理解的并不是.doc.txt等文件,这里所指的文档是mongoDB的一个存储单元(相当于关系型数据当中的记录),在mongoDB中的表现形式为{key1:value1,key2:value2},而内嵌文档则是这样的形式{key1:value1,key2:{key2.1:value2.1,key2.2:value2.2}}。
mongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
二、mongoDB的特性:
1.面向集合存储。数据被分组到若干集合,每个集合可以包含无限个文档,可以将集合想象成RDBMS的表,区别是集合不需要进行模式定义。
2.模式自由。集合中没有行和列的概念,每个文档可以有不同的key,key的值不要求一致的数据类型。
3.支持动态查询。mongoDB支持丰富的查询表达式,查询指令使用json形式表达式。
4.完整的索引支持。mongoDB的查询优化器会分析查询表达式,并生成一个高效的查询计划。
5.高效的数据存储,支持二进制数据及大型对象(图片、视频等)。
6.支持复制和故障恢复。
7.自动分片以支持云级别的伸缩性,支持水平的数据库集群,可动态添加额外的服务器。
三、mongoDB的适用场景:
1.适合作为信息基础设施的持久化缓存层
2.适合实时的插入、更新与查询,并具备应用程序实时数据存储所需的复制及高度伸缩性
3.适合文档化格式的存储及查询
4.适合由数十或数百台服务器组成的数据库
四、mongoDB不适用场景:
1.要求高度事务性的系统。例如对于银行或会计等需要大量原子性复杂事物的应用程序来说,还是需要关系型数据库的。
2.传统的商业智能应用
3.复杂的表级联查询
MongoDB中的数据有一个灵活的模式。不像SQL数据库,你必须确定在插入数据之前和声明一个表的模式,MongoDB的集合不执行文档结构。他灵活便利的映射文件一个实体或对象。每个文档可以匹配的数据字段代表的实体,即使数据有实质性的变化。然而在实践中,集合中的文件共享一个相似的结构。数据建模的关键挑战是平衡应用程序的需要,数据库引擎的性能特征,数据检索模式。在设计数据模型时,总是考虑应用程序使用的数据(如查询、更新和处理的数据)以及数据本身固有的结构。
文档结构
MongoDB应用程序的数据模型设计的关键决定因素是:围绕文档的结构以及应用程序表示数据之间的关系。有两个工具,允许应用程序表示这些关系:引用和嵌入的文档。
引用
引用引用存储关系数据,包括链接或引用从一个文档移到另一个地方。应用程序可以解决这些引用访问相关数据。广泛地说,这些都是规范化数据模型(描述使用引用文档之间的关系。)
使用条件:
(1)当可读性能的优势,大于数据重复时
(2)表示复杂的多对多关系时(3)大型分层数据集进行建模。
嵌入式存储相关数据捕捉数据之间的关系的文件在一个文档结构。MongoDB文档可以嵌入文档结构的子文档字段在一个文档或者数组。这些非规范化数据模型允许应用程序检索和操作相关的数据在一个单一的数据库操作。简单说就是:MongoDB,你可以将相关数据嵌入到一个结构或文档。这些模式通常被称为“非正规”模型,并利用MongoDB的丰富的文档。不用考虑表结构,嵌入式数据模型允许应用程序相关的信息存储在同一个数据库记录。结果是,应用程序可能需要完成常用操作问题更少的查询和更新。如下图:
使用条件:
(1)一对一的关系模型
(2)一对多的关系模型
在这中情况中,如果应用程序会经常通过用户名字段来查询改用户发布的博客信息。那么,把posts作为内嵌字段会是一个比较好的选择,这样就可以减少很多查询的操作。
一般而言,嵌入为读操作提供了更好的性能,以及能够在单个数据库操作请求和检索相关数据。嵌入式数据模型能够更新相关数据在一个单一的原子写操作。然而,在文档中嵌入相关数据可能导致文件创建后的增长情况。文档增长可影响写性能的影响,导致数据碎片。此外,MongoDB文档必须小于最大BSON文档大小。对于大部分二进制数据,请考虑GridFS.
写操作的原子性
在MongoDB文档级别的写操作是原子的,没有一个写操作可以自动影响多个文档或多个集合。规范化数据模型与嵌入式数据结合了所有相关的数据代表的实体在一个文档。这有助于原子写操作从一个写操作可以插入或更新数据实体。然而,写操作的原子可能会限制应用程序可以使用数据的方式也可能限制修改应用程序的方法。
数据使用和性能
如果应用程序的需求主要是读取操作集合,添加索引支持常见的查询可以提高性能。
小编结语:
更多内容尽在课课家教育!
¥48.00¥180.00
¥199.00
¥798.00
¥29.90
¥48.00¥180.00
¥199.00