1.定义

NoSQL(Not only SQL)是对不同于传统的关系数据库的数据库管理系统的统称,即广义地来说可以把所有不是关系型数据库的数据库统称为NoSQL。

NoSQL 数据库专门构建用于特定的数据模型,并且具有灵活的架构来构建现代应用程序。NoSQL 数据库使用各种数据模型来访问和管理数据。这些类型的数据库专门针对需要大数据量、低延迟和灵活数据模型的应用程序进行了优化,这是通过放宽其他数据库的某些数据一致性限制来实现的。

1.1 常见分类

键值数据库

键值:键值数据库是高度可分区的,并且允许以其他类型的数据库无法实现的规模进行水平扩展。

键值数据库是一种非关系数据库,它使用简单的键值方法来存储数据。键值数据库将数据存储为键值对集合,其中键作为唯一标识符。键和值都可以是从简单对象到复杂复合对象的任何内容。键值数据库是高度可分区·的,并且允许以其他类型的数据库无法实现的规模进行水平扩展。

内存数据库

内存:游戏和广告技术应用程序具有排行榜、会话存储和实时分析等使用案例,它们需要微秒响应时间并且可能随时出现大规模的流量高峰。

文档数据库

文档:在应用程序代码中,数据通常表示为对象或 JSON 文档,因为对开发人员而言它是高效和直观的数据模型。

文档数据库是一种非关系数据库,旨在将数据作为类 JSON 文档存储和查询。文档数据库让开发人员可以使用他们在其应用程序代码中使用的相同文档模型格式,更轻松地在数据库中存储和查询数据。文档和文档数据库的灵活、半结构化和层级性质允许它们随应用程序的需求而变化。文档模型可以很好地与目录、用户配置文件和内容管理系统等使用案例配合使用,其中每个文档都是唯一的,并会随时间而变化。文档数据库支持灵活的索引、强大的临时查询和文档集合分析。

图形数据库

图形:图形数据库旨在轻松构建和运行与高度连接的数据集一起使用的应用程序。热门图形数据库包括 Neo4j 和 Giraph。图形数据库专门用于存储和导航关系。关系是图形数据库中的一等公民,图形数据库的大部分价值都源自于这些关系。图形数据库使用节点来存储数据实体,并使用边缘来存储实体之间的关系。边缘始终有一个开始节点、结束节点、类型和方向,并且边缘可以描述父子关系、操作、所有权等。一个节点可以拥有的关系的数量和类型没有限制。

图形数据库中的图形可依据具体的边缘类型进行遍历,或者也可对整个图形进行遍历。在图形数据库中,遍历联结或关系非常快,因为节点之间的关系不是在查询时计算的,而是留存在数据库中。在社交网络、推荐引擎和欺诈检测等使用案例中,您需要在数据之间创建关系并快速查询这些关系,此时,图形数据库更具优势。

搜索数据库

搜索:许多应用程序输出日志以帮助开发人员解决问题。搜索引擎数据库是一种非关系数据库,专用于数据内容的搜索。搜索引擎数据库使用索引对数据之间的相似特征进行分类,并增强搜索功能。搜索引擎数据库经过优化,可处理可能是长数据,半结构数据或非结构数据的数据,并且它们通常提供专门的方法,例如全文搜索,复杂的搜索表达式和搜索结果排名。

1.2 BASE原则

BASE:Basically Available, Soft-state, Eventually Consistent。 由 Eric Brewer 定义。BASE是NoSQL数据库通常对可用性及一致性的弱要求原则:

  • Basically Availble –基本可用

  • Soft-state –软状态/柔性事务。 “Soft state” 可以理解为”无连接”的, 而 “Hard state” 是”面向连接”的

  • Eventual Consistency – 最终一致性, 也是是 ACID 的最终目的。

BASE模型是传统ACID模型的反面,不同于ACID,BASE强调牺牲高一致性,从而获得可用性,数据允许在一段时间内的不一致,只要保证最终一致就可以了。

1.3 特点

  1. 易扩展

当一台机器不够用了,很容易添加一个新的服务器,只要配置好环境之后,自动使用。
2. 大数据量、高性能

读写速度快,nosql基本都是内存数据库,比硬盘存储要快很多,查询数据快。
3. 灵活性

NoSQL无需事先为 要存储的数据 建立字段,随时可以存储自定义的数据格式,在关系型数据库添加字段和删除字段是非常麻烦的。
4. 高可用

一台机器宕机出问题了,不会影响其他的机器。

MongoDB技术原理

MongoDB是一个基于分布式文件存储的数据库,使用BSON格式保存数据,使用B-树作为索引结构,每个节点即保存数据又保存索引,可以为WEB应用提供可拓展、高性能、易部署的数据存储解决方案。

BSON

BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和Binary Data类型。BSON可以做为网络数据交换的一种存储形式,是一种schema-less的存储形式,它的优点是灵活性高,但它的缺点是空间利用率不是很理想。

MongoDB索引底层原理

MongoDB使用B-树,所有节点都有Data域,只要找到指索引就可以进行访问,单次查询从结构上来看要快于MySql。

B-树

B-树的特点:
(1) 多路 非二叉树
(2) 每个节点 既保存数据 又保存索引
(3) 搜索时 相当于二分查找

20210107091340399.png

MongoDB架构

image.png

MongoDB 与 MySQL 中的架构相差不多,底层都使用了可插拔的存储引擎以满足用户的不同需要。用户可以根据程序的数据特征选择不同的存储引擎,在最新版本的 MongoDB 中使用了 WiredTiger 作为默认的存储引擎,WiredTiger 提供了不同粒度的并发控制和压缩机制,能够为不同种类的应用提供了最好的性能和存储率。
在存储引擎上层的就是 MongoDB 的数据模型和查询语言了,由于 MongoDB 对数据的存储与 RDBMS有较大的差异,所以它创建了一套不同的数据模型和查询语言。

数据模型

  • 内嵌
    内嵌的方式指的是把相关联的数据保存在同一个文档结构之中。MongoDB的文档结构允许一个字段或者一个数组内的值作为一个嵌套的文档

  • 引用
    引用方式通过存储数据引用信息来实现两个不同文档之间的关联,应用程序可以通过解析这些数据引用来访问相关数据

应用场景

MongoDB的应用场景包括物流、社交、物联网、游戏等领域。在物流场景中,MongoDB可以存储订单信息,订单状态在运送过程中会不断更新,以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。在社交场景中,MongoDB可以存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。在物联网场景中,MongoDB可以存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。此外,MongoDB还适合用于日志存储、敏捷开发、地理位置信息存储、json存储等场景。MongoDB不适合高度事务性的系统,例如银行或会计系统,以及传统的商业智能应用。

案例1

用在应用服务器的日志记录,查找起来比文本灵活,导出也很方便。也是给应用练手,从外围系统开始使用MongoDB。 用在一些第三方信息的获取或者抓取,因为MongoDB的schema-less,所有格式灵活,不用为了各种格式不一样的信息专门设计统一的格式,极大的减少开发的工作。

案例2

使用MongoDB做了O2O快递应用,·将送快递骑手、快递商家的信息(包含位置信息)存储在 MongoDB,然后通过 MongoDB 的地理位置查询,这样很方便的实现了查找附近的商家、骑手等功能,使得快递骑手能就近接单,

DEMO展示

MongoDB的安装

image1.png

image2.png

可视化工具MongoDB Compass

image3.png

基本功能展示

新增数据库和表

image4.png

image5.png

插入

image6.png

修改

image7.png

按条件查询

image8.png

删除

image9.png

java连接MongoDB,使用基本CRUD操作

建立连接

image10.png

新增

image11.png

image12.png

image13.png

删除

image14.png

image15.png

插入

image16.png

image17.png

查找

image18.png

image19.png

按名字查找

image20.png

image21.png

总结

通过对MongoDB 基本CRUD的使用,可以发现,MongoDB的query语句比起Mysql来说更为简洁直接,而数据的存储也是明显使用键值对的方式进行的,并且配备有对应独特的ObjectId,方便查询。同时,条件查询的语句更为简洁明白,添加,删除字段的方式更加简单,明白,不用刻意去强调数据的类型。但是,MongoDB无事务处理,附加功能和报表支持也不好,在与编程语言结合这一点上远不如mysql已经开发好的众多方法来的快速简单。