大数据学习之NoSQL数据库

NoSQL的概述

NoSQL的特点

  • 灵活的扩展性
  • 灵活的数据模型
  • 与云计算密切相关

传统关系数据库性能缺陷

  • 无法满足海量数据的管理需求
  • 无法满足高并发的需求
  • 无法满足高可扩展性和高可用性的需求

MySQL集群方式的缺陷

  • 复杂性,整个集群部署管理配置都非常复杂
  • 延迟性,当主库压力较大时,就会带来较大的延迟
  • 扩容问题,整个集群压力过大时,需要增加新机器对整个数据集进行重新分区,非常复杂

NoSQL数据库与关系数据库的比较

  1. 数据库原理方面,关系数据库具有完备的关系代数理论作为基础;NoSQL数据库缺乏理论基础
  2. 数据规模方面,关系数据库很难实现横向扩展,纵向扩展非常有限;NoSQL数据库具有非常好的水平可扩展性
  3. 数据库模式方面,关系数据库要定义严格的数据库模式,而且要严格遵守事先定义的数据库模式;NoSQL数据库的数据模型非常灵活
  4. 查询效率方面,关系数据库在适当数据量下的查询效率高,数据量增大后查询效率下降;NoSQL为构建面向复杂查询的索引,查询性能差,虽然NoSQL可以使用MapReduce来加速查询,但是,在复杂查询方面的性能仍然不如关系数据库。
  5. 事务一致性方面,关系数据库遵循ACID事务模型可以保证事务强一致性;NoSQL数据库放松了对事务ACID四性的要求,而是遵守BASE模型,只能保证最终一致性。
  6. 数据完整性方面,关系数据库可以很容易实现数据完整性,比如通过主键或者非空约束来实现实体完整性,通过主键、外键来实现参照完整性,通过约束或者触发器来实现用户自定义完整性;NoSQL数据库却无法实现完整性约束
  7. 可扩展性方面,关系型数据库扩展性较差;NoSQL可扩展性好
  8. 可用性方面,关系数据库在任何时候都以保证数据一致性为优先目标,其次才是优化系统性能,随着数据规模的增大,关系数据库为了保证严格的一致性,只能提供相对较弱的可用性;NoSQL数据库都能提供较高的可用性,能在短时间内迅速返回所需的结果
  9. 标准化方面,关系数据库遵循SQL标准,标准化比较完善;NoSQL数据库未形成通用的行业标准
  10. 技术支持方面,关系数据库大多是商业数据库,可获得非常强大的技术和后续服务支持;NoSQL数据库很多属于开源产品,处于发展阶段
  11. 可维护性方面,关系数据库需要管理员维护;NoSQL数据库没有成熟的基础,维护较为复杂

NoSQL的四大类型

1. 键值数据库,比如redis

数据模型:键是一个字符串对象,值可以是任意类型的数据
应用范围:涉及频繁的读写,拥有简单数据类型的应用,如会话、配置文件、参数、购物车等,存储配置和用户数据信息的移动应用
优点:扩展性好,灵活性好,大量写操作时性能高
缺点:无法存储结构化信息,条件查询效率较低
不适用情形:不是通过键而是通过值来查(键值数据库没有通过值查询的途径)、需要存储数据之间的关系(在键值数据库中,不能通过两个或两个以上的键来关联数据)、需要事务的支持(在一些键值数据库中,产生故障时,不可以回滚 )

2. 列族数据库,HBase根据列族进行垂直划分,根据行键进行水平划分

数据模型:列族
应用范围:分布式数据存储与管理,数据在地理上分布于多个数据中心的应用程序,可以容忍副本中存在短期不一致情况的应用程序,拥有动态字段的应用程序,拥有潜在大量数据的应用程序,大到几百TB的数据
优点:查找速度快,可扩展性强,容易进行分布式扩展,复杂性低
缺点:功能较少,大都不支持强事务一致性
不适用情形:需要ACID事务支持的情形,Cassandra等产品就不适用

3. 文档数据库,本质上可以看成一个键值数据库,它的值是文档而不是非标量,比如mongoDB

特性:能够将自己的数据的内容和类型进行自我描述
常用数据结构:JSON数据格式
应用范围: 存储、索引并管理面向文档的数据或者类似的半结构化数据,比如,用于后台具有大量读写操作的网站、使用JSON数据结构的应用、使用嵌套结构等非规范化数据的应用程序
优点:性能好(高并发),灵活性高,复杂性低,数据结构灵活提供嵌入式文档功能,将经常查询的数据存储在同一个文档中既可以根据键来构建索引,也可以根据内容构建索引
缺点:缺乏统一的查询语法
不适用情形:在不同的文档上添加事务。文档数据库并不支持文档间的事务,如果对这方面有需求则不应该选用这个解决方案

4. 图数据库,以图结构方式存储相关信息,比如Neo4j

数据模型:图结构
应用范围:专门用于处理具有高度相互关联关系的数据,比较适合于社交网络、模式识别、依赖分析、推荐系统以及路径寻找等问题
优点:灵活性高,支持复杂的图形算法,可用于构建复杂的关系图谱
缺点:复杂性高,只能支持一定的数据规模

NoSQL数据库的三大理论基石

1. CAP

  • C(Consistency)一致性,指任何一个读操作总能读到之前完成的写操作的结果,在分布式环境中,多点的数据是一
    致的,或者说,所有节点在同一时间具有相同的数据
  • A(Availability)可用性,指快速获取数据,可以在确定的时间内返回操作结果,保证每个请求不管成功或者失败都有响应
  • P(Partition tolerance)分区容忍性,是指当出现网络分区的情况时(即系统中的一部分节点无法和其他节点进行通信),分离的系统也能够正常运行,也就是说,系统中任意信息的丢失或失败不会影响系统的继续运作
    一个分布式系统不可能同时满足一致性、可用性和分区容忍性这三个需求,最多只能同时满足其中两个

2. BASE在这里插入图片描述

一个数据库事务具有ACID四性:

  • A(Atomicity):原子性,是指事务必须是原子工作单元,对于其数据修改,要么全都执行,要么全都不执行
  • C(Consistency):一致性,是指事务在完成时,必须使所有的数据都保持一致状态
  • I(Isolation):隔离性,是指由并发事务所做的修改必须与任何其它并发事务所做的修改隔离
  • D(Durability):持久性,是指事务完成之后,它对于系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持

3. 最终一致性

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

文档数据库MongoDB

MongoDB由C++语言编写,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能,MongoDB旨在为web应用提供可扩展的高性能数据存储解决方案。

MongoDB特点

  • 操作简单,面向文档存储
  • 可以设置任何属性的索引,实现快速排序
  • 具有很好的水平可扩展性
  • 支持丰富的查询表达式,可查询文档中内嵌的对象及数据
  • 可替换已完成文档中某个指定的数据字段
  • MongoDB中的MapReduce主要是用来对数据进行批量处理和聚合操作
  • 安装简单
    在这里插入图片描述
    在一个关系型数据库中,一篇博客的相关内容会存放在多张数据表中(如下图)。在查询时,需要‘join’操作
    在这里插入图片描述
    在文档数据库MongoDB中,能用一个文档来表示一篇博客,评论与投票作为文档数组,放在正文主文档中。这样数据更易于管理,消除了传统关系型数据库中影响性能和水平扩展性的“JOIN”操作。

在这里插入图片描述

  1. 数据库
  • 一个MongoDB中可以建立多个数据库。
  • MongoDB的默认数据库为"db",该数据库存储在data目录中
  • MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文
    件中。
  1. 文档
    文档是一个键值(key-value)对(即BSON)。
    MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别
  2. 集合
    集合就是MongoDB文档组,类似于关系数据库中的表格,关系数据库中的一行记录对应一个MongoDB文档
    集合存在于数据库中,没有固定的结构,可对集合插入不同格式和类型的数据
    MongoDB数据类型较多,有字符型、整型、布尔型等
    在这里插入图片描述

MongoDB安装

  • Window平台安装MongoDB
    MongoDB提供32位和64位系统的编译二进制包,可以直接在MongoDB的官网下载
  • Linux平台安装MongoDB
    可直接通过命令sudo apt install mongodb-org进行安装
    启动MongoDB sudo service mongod start

使用MongoDB shell 访问 MongoDB

  1. 连接服务器
    使用MongolianDB shell来连接MongoDB服务器 mongodb:// localhost
  2. 登录数据库
    使用用户名和密码连接登陆到指定数据库 mongodb://admin:123456@localhost/test
  3. 创建数据库
    使用 use DATABASE_NAME进行创建
  4. 创建集合
    MongoDB没有单独创建集合的shell命令,在插入数据时,自动创建对应的集合
  5. 插入文档
    使用命令db.COLLECTION_NAME.insert(document)插入相关的文档

使用Java程序访问MongoDB

  1. 配置环境
    需先确保已安装Java环境MongoDB JDBC驱动,下载 mongo jar包,然后将mongo.jar包放在工程的classpath中
  2. 连接数据库
import com.mongodb.MongoClient;
……//这里省略其他需要导入的包
public class MongoDBJDBC{
	public static void main( String args[] ){
		try{ //连接到mongodb服务
			MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
			//连接到数据库
			DB db = mongoClient.getDB( "test" );
			System.out.println("Connect to database successfully");
			boolean auth = db.authenticate(myUserName, myPassword);
			System.out.println("Authentication: "+auth);
		}catch(Exception e){
			System.err.println( e.getClass().getName() + ": " + e.getMessage() );
		}
	}
}
  1. 创建集合
    可用com.mongodb.DB类中的createCollection()来创建集合
public class MongoDBJDBC{
	public static void main( String args[] ){
		try{
			//连接到mongodb服务
			MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
			//连接到数据库
			DB db = mongoClient.getDB( "test" );
			System.out.println("Connect to database successfully");
			boolean auth = db.authenticate(myUserName, myPassword);
			System.out.println("Authentication: "+auth);
			DBCollection coll = db.createCollection("mycol");  // 创建的集合
			System.out.println("Collection created successfully");
		}catch(Exception e){
			System.err.println( e.getClass().getName() + ": " + e.getMessage() );
		}
	}
}
  1. 插入文档
    可用com.mongodb.DBCollection类中的insert()来插入文档
public class MongoDBJDBC{
	public static void main( String args[] ){
		try{
			//连接到mongodb服务
			MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
			//连接到数据库
			DB db = mongoClient.getDB( "test" );
			System.out.println("Connect to database successfully");
			boolean auth = db.authenticate(myUserName, myPassword);
			System.out.println("Authentication: "+auth);
			DBCollection coll = db.createCollection("mycol");  // 创建的集合
			System.out.println("Collection mycol selected successfully");
			// 插入文档操作
			BasicDBObject doc = new BasicDBObject("title", "MongoDB"). 
			append("description", "database").
			append("likes", 100).
			append("url", "http://www.w3cschool.cc/mongodb/").
			append("by", "w3cschool.cc");
			coll.insert(doc);
			System.out.println("Document inserted successfully");		
		}catch(Exception e){
			System.err.println( e.getClass().getName() + ": " + e.getMessage() );
		}
	}
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值