注:本系列教程是自己学习的记录,内容来至 菜鸟教程
MongoDB入门教程01
MongoDB入门教程02
MongoDB入门教程03
MongoDB入门教程04
MongoDB入门教程05
1. MongoDB是什么?
一个NoSQL数据库,是NoSQL中的一个分支:文档数据库。
一个基于分布式文件存储的数据库。由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储方案。
一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富,最像关系数据库的。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
2. MongoDB的主要特点
MongoDB是一个面向文档存储的数据库,安装、操作简单
可以设置任何属性的索引(如:firstname="Sameer", Address="8 Gandhi Road")来实现更快的排序
可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性
如果负载增加(需要更多的存储空间和更强的处理能力),可以分布在计算机网络中的其他节点上,这就是所谓的分片
支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组
使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段
Map/Reduce主要是用来对数据进行批量处理和聚合操作
Map和Reduce Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理
Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作
GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件
允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可
支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言
3. NoSQL的应用场景是什么?
摘至:作者 接灰的电子产品 链接 https://www.jianshu.com/p/fe3b9532b852
假设说我们现在要构建一个论坛,用户可以发布帖子(帖子内容包括文本、视频、音频和图片等)。那么我们可以画出一个下图的表关系结构。
这种情况下如果我们需要展示帖子的文字,以及关联的图片、音频、视频、用户评论、赞和用户信息的话,我们需要关联8张表来取得自己想要的数据。如果我们有这样的帖子列表,随着用户的滚动动态加载,同时需要监听是否有新内容产生,这样的一个任务我们需要太多这种复杂的查询了。
NoSQL解决这类问题的思路是,干脆抛弃传统的表结构,直接存储包含一个帖子所有内容的数据,像下面这样。
{
"id":"5894a12f-dae1-5ab0-5761-1371ba4f703e",
"title":"2017年的Spring发展方向",
"date":"2017-01-21",
"body":"这篇文章主要探讨如何利用Spring Boot集成NoSQL",
"createdBy":User,
"images":["http://dev.local/myfirstimage.png","http://dev.local/mysecondimage.png"],
"videos":[
{"url":"http://dev.local/myfirstvideo.mp4", "title":"The first video"},
{"url":"http://dev.local/mysecondvideo.mp4", "title":"The second video"}
],
"audios":[
{"url":"http://dev.local/myfirstaudio.mp3", "title":"The first audio"},
{"url":"http://dev.local/mysecondaudio.mp3", "title":"The second audio"}
]
}
NoSQL一般情况下是没有Schema这个概念的,这给开发带来了较大的自由度。因为在关系型数据库中,一旦Schema确定,以后更改Schema,维护Schema是很麻烦的一件事。但反过来说Schema对于维护数据的完整性是非常必要的。
一般来说,如果你在做一个Web、物联网等类型的项目,你应该考虑使用NoSQL。如果你要面对的是一个对数据的完整性、事务处理等有严格要求的环境(如财务系统),则应该考虑关系型数据库。
4. NoSQL 简介
NoSQL(= Not Only SQL),即"不仅仅是SQL"。
在现代的计算系统上每天网络上都会产生庞大的数据量。
这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。 1970年 E.F.Codd's提出的关系模型的论文 "A relational model of data for large shared data banks",这使得数据建模和应用程序编程更加简单。
关系型模型是非常适合于客户服务器编程,是结构化数据在网络和商务应用的主导技术。
NoSQL用于超大规模数据的存储。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
select fun, profit from real_world where relational=false
5. 关系型数据库遵循ACID规则
事务 Transaction,和现实中的交易很类似,有四个特性:
-
A (Atomicity) 原子性
事务里的所有操作,要么全部做完,要么都不做,只要事务中的一个任务失败,整个事务就失败,需要回滚。如银行转账,从A账户转100元到B账户,分为两个步骤:1)从A账户取100元;2)存入100元到B账户。要么一起做完,要么都不做,否则钱就会莫名其妙的少了100元。
-
C (Consistency) 一致性
数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。如完整性约束 a + b = 10,如果一个事务改变了a,那么必须改变b,使得事务结束后依然满足 a+b=10,否则事务失败。
-
I (Isolation) 独立性
独立性指并发的事务之间不会互相影响,如果一个事务要访问的数据,正在被另一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。如从A账户转100元到B账户,在这个交易尚未完成的情况下,B查询自己的账户,是看不到新增加的100元的。
-
D (Durability) 持久性
持久性是指一旦事务提交后,它的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。
6. 分布式系统
分布式系统(distributed system)由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。
分布式系统是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。
因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。
分布式系统可以应用在不同的平台上如:Pc、工作站、局域网和广域网上等。
7. CAP定理(CAP theorem)
又称布鲁尔定理(Brewer's theorem):一个分布式计算系统,不可能同时满足以下三点:
-
一致性(Consistency)
所有节点在同一时间具有相同的数据
-
可用性(Availability)
保证每个请求不管成功或者失败都有响应
-
分隔容忍(Partition tolerance)
系统中任意信息的丢失或失败不会影响系统的继续运作
CAP的核心理论是:一个分布式系统不可能很好的同时满足一致性,可用性和分隔容忍这三个需求,最多能同时满足其中两个。
因此,可将NoSQL数据库分成满足CA原则,满足CP原则和满足AP原则三大类:
CA:单点集群,满足一致性和可用性,通常在可扩展性上不强大
CP:满足一致性,分区容忍性的系统,通常性能不是特别高
AP:满足可用性,分区容忍性的系统,对一致性要求较低
8. 分布式计算的优点
-
可靠性(容错)
分布式计算系统中的一个重要优点就是可靠性。一台服务器的系统崩溃并不影响到其余的服务器
-
可扩展性
在分布式计算系统可以根据需要增加更多的机器
-
资源共享
共享数据是必不可少的应用,如银行、预定系统
-
灵活性
由于该系统非常灵活,它更容易安装,实施和调试新的服务
-
更快的速度
分布式计算系统可以有多台计算机的计算能力,使得它比其他系统有更快的处理速度
-
开放系统
本地或者远程都能访问到该服务
-
更高的性能
更好的性价比
9. 分布式计算的缺点
-
故障排除
故障排除和诊断问题更加困难
-
软件
更少的软件支持
-
网络
基础设施的问题,包括:传输问题,高负载,信息丢失等
-
安全性
开放系统的特性存在数据的安全性和共享的风险等问题
10. RDBMS vs NoSQL
RDBMS
高度组织化结构化数据
结构化查询语言 SQL
数据和关系都存储在单独的表中
数据操作语言,数据定义语言
严格的一致性
基础事务
NoSQL
代表着不仅仅是SQL
没有声明性查询语言
没有预定义的模式
key-value 键值对存储,列存储,文档存储,图形数据库
最终一致性,而非ACID属性
非结构化和不可预知的数据
CAP定理
高性能,高可用性和可伸缩性
11. BASE
Base:Basically Available,Soft-state,Eventually Consistent
BASE是NoSQL数据库通常对可用性及一致性的弱要求原则:
Basically Available — 基本可用
Soft-state — 软状态/柔性事务。无连接的
Eventually Consistent — 最终一致性,ACID的最终目的
12. NoSQL数据库的分类
类型 | 代表NoSQL | 特点 |
---|---|---|
列存储 | Hbase、 Cassandra、 Hypertable | 按列存储数据。特点是方便存储结构化和半结构化数据,方便数据压缩,对针对某一列或者某几列的查询有非常大的IO优势 |
文档存储 | MongoDB、CouchDB | 文档存储 一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。 |
键值对存储 | Redis、 Tokyo Cabinet / Tyrant、 Berkeley DB、 MemcacheDB | 可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能) |
图存储 | Neo4J、FlockDB | 图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。 |
对象存储 | db4o、 Versant | 通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。 |
xml数据库 | Berkeley DB XML、 BaseX | 高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。 |