NoSQL 数据库概览及其与 SQL 语法的比较
NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用的难题。
本文对NoSQL数据库的定义、分类、特征、当前比较流行的NoSQL数据库系统等进行了简单的介绍,并对NoSQL和SQL语法进行了简单的比较,为大家对NoSQL数据库的学习提供了有益的参考。
一、NoSQL的出现
关系型数据库系统多年来在解决数据存储、服务和处理问题方面取得了巨大的成功。一些大型的公司使用关系型数据库建立了自己的系统,如联机事务处理系统和后端分析应用系统。联机事务处理(OLTP)系统用来实时记录交易信息。对这类系统的期望是能够快速返回响应信息(一般在毫秒级)。联机分析处理(OLAP)系统用来分析查询所储存的数据。OLAP属于商业智能的范畴,数据需要研究、处理和分析,以便收集信息,进一步驱动商业决策。
关系型数据库的内部设计由关系算法决定,这些系统需要预先定义一个模式(schema)和数据要遵守的类型。SQL是与这些系统交互的标准方式。但在对象-关系不匹配问题出现的场合,SQL就不是表达访问模式的最好方式了。例如目前炙手可热的大数据领域,关系型数据库不能很好地工作。
有关大数据常见定义包括:第一,大数据意味着数据足够大,为了从这些数据中获得一些真知灼见,你不得不研究它;第二,大数据就是不再适用于单台机器的数据。这些观点并不完整,我们需要用一种根本上不同的方式来考虑数据,从如何驱动商业价值的角度来考虑数据,这种数据就是大数据。
在大数据领域中,系统需要能够适应不同种类的数据格式和数据源,不需要预先严格定义模式,并且能够处理大规模数据。这样,NoSQL就出现了。
二、NoSQL的定义
NoSQL(NoSQL= Not Only SQL ),意即“不仅仅是SQL”,是一项全新的数据库革命性运动。NoSQL的拥护者们提倡运用非关系型的数据存储。大多数数据库技术不能保证支持ACID(原子性、一致性、隔离性和持久性),而且大部分技术都是开源项目,这些技术作为整体被称为NoSQL。
三、NoSQL的分类
一般将NoSQL数据库分为四大类:键值(Key-Value)存储数据库、列存储数据库、文档型数据库和图形(Graph)数据库。它们的数据模型、优缺点、典型应用场景如表1所示。
表1 四大NoSQL数据库分析
四、NoSQL的特征
NoSQL数据库并没有一个统一的架构,但是它们都普遍存在表2所示的一些共同特征。
表2 NoSQL的特征
特征 |
描述 |
不需要预定义模式 |
不需事先定义数据模式,预定义表结构等。数据中每条记录都可能有不同的属性和格式 |
无共享架构 |
NoSQL往往将数据划分后存储在各个本地服务器上,从而提高了系统的性能 |
弹性可扩展 |
可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移 |
分区 |
NoSQL数据库将数据进行分区,将记录分散在多个节点上面,并且通常分区的同时还要做复制 |
异步复制 |
NoSQL中的复制,往往是基于日志的异步复制。这样,数据就可以尽快地写入一个节点,而不会出现网络传输迟延 |
BASE |
相对于ACID特性,NoSQL数据库保证的是BASE特性(BASE是最终一致性和软事务) |
五、常见的NoSQL数据库
比较适合采用NoSQL数据库的场合是:(1)数据模型比较简单;(2)需要灵活性更强的IT系统;(3)对数据库性能要求较高;(4)不需要高度的数据一致性;(5)对于给定key,比较容易映射复杂值的环境。
常见的NoSQL数据库如表3所示。
表3常见的NoSQL数据库
分类 |
实例 |
键值(Key-Value)存储数据库 |
* Riak:一个开源、分布式键值数据库,支持数据复制和容错 * Redis:一个开源的键值存储数据库,支持主从式复制、事务,Pub/Sub、Lua脚本,还支持给Key添加时限 * Dynamo:一个键值分布式存储数据库,直接由亚马逊Dynamo数据库实现 * Oracle NoSQL Database:来自Oracle的键值NoSQL数据库,支持事务ACID和JSON * Oracle NoSQL Database:具备数据备份和分布式键值存储系统 * Voldemort:具备数据备份和分布式键值存储系统 * Aerospike:一个键值存储数据库,支持混合内存架构,通过强一致性和可调一致性保证数据的完整性 |
列存储数据库 |
* Cassandra:支持跨数据中心的数据复制,提供列索引 * HBase:一个开源、分布式、面向列存储的模型 * Amazon SimpleDB:一个非关系型数据存储 * Apache Accumulo:有序的、分布式键值数据存储,基于Google的BigTable设计 * Hypertable:一个开源、可扩展的数据库,模仿Bigtable,支持分片 * Azure Tables:为要求大量非结构化数据存储的应用提供NoSQL性能 |
文档型数据库 |
* MongoDB:开源、面向文档 * CounchDB:一个使用JSON的文档数据库,使用Javascript做MapReduce查询,也是一个使用HTTP的API * Couchbase:基于JSON模型 * RavenDB:一个基于.net语言的面向文档数据库 * MarkLogic:用来存储基于XML和以文档为中心的信息,支持灵活的模式 |
图形(Graph)数据库 |
* Neo4j:一个图数据库,支持ACID事务 * InfiniteGraph:用来维持和遍历对象间的关系,支持分布式数据存储 * AllegroGraph:结合使用了内存和磁盘,提供了高可扩展性,支持SPARQ、RDFS++和Prolog推理 |
六、NoSQL和SQL语法的简单比较
前面介绍了NoSQL的基本情况,下面以HBase和ORACLE为例,对NoSQL和SQL的语法进行简单的比较。HBase数据库被认为是安全特性最完善的NoSQL数据库产品之一,它被证实是一个强大的工具,尤其是在已经使用Hadoop的场合。如今,它已经是Apache顶级项目,有着众多的开发人员和兴旺的用户社区。
1.创建表
如果要创建一个表“mytable”,其中包含了一个“info”字段,那么:
(1)ORACLE中的语法为:
create table mytable
(
info varchar(30) not null
);
(2)HBase中的语法为:
create 'mytable', 'cf'
该命令创建了一个有一个列族(“cf”)的表“mytable”。
2.写数据
如果要向表中写入数据“hello hbase”,那么:
(1)ORACLE中的语法为:
insert into mytable(info) values('hello hbase');
(2)HBase中的语法为:
put 'mytable', 'first', 'cf:info', 'hello hbase'
该命令在“mytable”表的“first”行中的“cf:info”列对应的数据单元中插入“hello hbase”。
3.读(查)数据
如果要从表中读出单条数据,那么:
(1)ORACLE中的语法为:
select * from mytable where info = 'hello hbase';
(2)HBase中的语法为:
get 'mytable', 'first'
该命令输出了该行的数据单元。
如果要从表中读出所有数据,那么:
(1)ORACLE中的语法为:
select * from mytable;
(2)HBase中的语法为:
scan 'mytable'
该命令输出了所有数据。
4.删数据
如果要从表中删除数据,那么:
(1)ORACLE中的语法为:
delete from mytable where info = 'hello hbase';
(2)HBase中的语法为:
put 'mytable', 'first', 'cf:info', 'hello hbase1'
该命令用最新的值覆盖了旧的值,就相当于将原数据删除了。
5.修改数据
如果要在表中修改数据,那么:
(1)ORACLE中的语法为:
update mytable set info = 'hello hbase1' where info = 'hellohbase';
(2)HBase中的语法为:
put 'mytable', 'first', 'cf:info', 'hello hbase1'
该命令用最新的值覆盖了旧的值,就相当于修改了原数据。
6.删表
如果要删除表,那么:
(1)ORACLE中的语法为:
drop table mytable;
(2)HBase中的语法为:
disable 'mytable'
drop 'mytable'
该命令先将表“disable”掉,然后再“drop”掉。
我们可以看到,HBase的语法比较的简单,因此完全可以将上述所有命令放到一个shell脚本中,让命令批量执行。下面,我们来具体操作一下:
第一步,编写名为“command.sh”的脚本,其内容如下:
exec /root/zhouzx/hbase-1.0.1/bin/hbase shell <<EOF
create 'mytable', 'cf'
put 'mytable', 'first', 'cf:info', 'hello hbase'
get 'mytable', 'first'
scan 'mytable'
put 'mytable', 'first', 'cf:info', 'hello hbase1'
disable 'mytable'
drop 'mytable'
EOF
第二步,将该脚本上传到Linux机器的安装HBase的用户下,依次执行“dos2unix command.sh”和“chmod 777command.sh”命令来转换文件格式和对文件赋权限。
第三步,执行“./command.sh”命令,在Linux界面上,我们可以看到如下输出信息:
HBase Shell; enter 'help<RETURN>' for list of supportedcommands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.0.1, r66a93c09df3b12ff7b86c39bc8475c60e15af82d, Fri Apr17 22:14:06 PDT 2015
create 'mytable', 'cf'
0 row(s) in 0.6660 seconds
Hbase::Table - mytable
put 'mytable', 'first', 'cf:info', 'hello hbase'
0 row(s) in 0.1140 seconds
get 'mytable', 'first'
COLUMN CELL
cf:info timestamp=1435807200326, value=hello hbase
1 row(s) in 0.0440 seconds
scan 'mytable'
ROW COLUMN+CELL
first column=cf:info,timestamp=1435807200326, value=hello hbase
1 row(s) in 0.0210 seconds
put 'mytable', 'first', 'cf:info', 'hello hbase1'
0 row(s) in 0.0040 seconds
disable 'mytable'
0 row(s) in 1.1930 seconds
drop 'mytable'
0 row(s) in 0.1940 seconds
整个脚本执行过程不过几秒钟,但我们之前提到的所有HBase命令都包括其中了,由此可见批处理的威力。大家一定要好好体会一下。
七、总结
本文对NoSQL进行了全面的介绍,并比较了它与SQL语法之间的不同。尽管大多数NoSQL数据存储系统都已被部署到实际应用中,但仍存在以下挑战性问题需要解决:
第一,已有key-value数据库产品大多是面向特定应用自治构建的,缺乏通用性。
第二,已有产品支持的功能有限(不支持事务特性),导致其应用具有一定的局限性。
第三,已有一些研究成果和改进的NoSQL数据存储系统,但它们都是针对不同应用需求而提出的相应解决方案,很少从全局考虑系统的通用性,也没有形成系列化的研究成果。
第四,缺乏类似关系数据库所具有的强有力的理论(如armstrong公理系统)、技术(如成熟的基于启发式的优化策略、两段封锁协议等)、标准规范(如SQL语言)的支持。
第五,很多NoSQL数据库没有提供内建的安全机制。
随着云计算、移动互联网等技术的发展,大数据广泛存在,同时也出现了许多云环境下的新型应用,如社交网络、移动服务、协作编辑等。这些新型应用对海量数据管理或称云数据管理系统也提出了新的需求,NoSQL数据库在这些方面有大展身手的机会。我们有理由相信,NoSQL数据库的明天会更加的美好!
NoSQL 数据库概览及其与 SQL 语法的比较的更多相关文章
- NoSQL数据库概览及其与SQL语法的比較
[文章摘要] HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统.同一时候也是知名的NoSQL数据库之中的一个.NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤 ...
- 【一个idea】YesSql,一种在经典nosql数据库redis上实现SQL引擎的方案(我就要开历史的倒车)
公众号链接 最高级的红酒,一定要掺上雪碧才好喝. 基于这样的品味,我设计出了一套在经典nosql数据库redis上实现SQL引擎的方法.既然redis号称nosql,而我偏要把SQL加到redis上, ...
- mysql用户授权、数据库权限管理、sql语法详解
mysql用户授权.数据库权限管理.sql语法详解 —— NiceCui 某个数据库所有的权限 ALL 后面+ PRIVILEGES SQL 某个数据库 特定的权限SQL mysql 授权语法 SQL ...
- MySql数据库的一些基本操作---------------SQL语法
MySql数据库是比较常用的关系型数据库,操作用的是sql语句,下面来说一说MySql的一些基本操作 MySql数据库是一种C/S型的模式,即客户端/服务器端,对应到具体应用上,便是bin目录下的my ...
- 告诉你 SQL 数据库与 NoSQL 数据库的区别
简单来说 SQL 数据库和 NoSQL 数据库有着共同的目标:存储数据,但存储的方式不同 一. 表 SQL中的表结构具有严格的数据模式约束: 存储数据很难出错. NoSQL存储数据更加灵活自由:可能导 ...
- MySQL的操作数据库SQL语法
MySQL的操作数据库SQL语法 顺序:操作数据库 > 操作数据库中的表 > 操作数据库中的表的数据 MySQL不区分大小写字母 1. 操作数据库 1.创建数据库 2.删除数据库 3.使用 ...
- 技术分享|SQL和 NoSQL数据库之间的差异:MySQL(VS)MongoDB
在当今市场上,存在各种类型的数据库,选择适合你业务类型的数据库对应用的开发和维护有着重要意义.本篇文章,将为大家分享SQL和NoSQL语言之间的区别,同时还将比较这两种类型的数据库,以帮助小伙伴们选择 ...
- 常用数据库2 sqlite及SQL注入
知识内容: 1.sqlite数据库介绍 2.sqlite数据库操作 3.SQL注入 一.sqlite数据库介绍 1.sqlite数据库 sqlite数据库:轻量级的数据库,一般开发中使用sqlite数 ...
- NoSQL数据库的认识
SQL数据库和NoSQL数据库介绍 什么是SQL数据库? 关系型数据库是依据关系模型来创建的数据库.而所谓的关系模型就是“一对一.一对多.多对多”等关系模型,这是一种二维表格模型,因此一个关系型数据库 ...
随机推荐
- Fastcgi_Finish_Request 提高页面响应速度
当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法.按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行 ...
- Unity3D 新版粒子系统 (Shuriken)
Shuriken粒子系统是继Unity3.5版本之后推出的新版粒子系统,它采用了模块化管理,个性化的粒子模块配合粒子曲线编辑器使用户更容易创作出各种兵分复杂的粒子效果. 创建一个粒子系统的方式有两种: ...
- 【BZOJ】1625: [Usaco2007 Dec]宝石手镯(01背包)
http://www.lydsy.com/JudgeOnline/problem.php?id=1625 太水了. #include <cstdio> #include <cstri ...
- FormData异步上传
1.代码片段一: ajaxUpload: function () { var url = this.$avatarForm.attr('action'), data = new FormData(th ...
- MyBatis 3.2.6插入时候获取自增主键方法
MyBatis 3.2.6插入时候获取自增主键方法有二 以MySQL5.5为例: 方法1: <insert id="insert" parameterType="P ...
- Angular ContentChild
contentchild // 使用方法 git clone https://git.oschina.net/mumu-osc/learn-component.git cd learn-compone ...
- WinForm------如何打开子窗体的同时关闭父窗体
方法: 如何打开子窗体的同时关闭父窗体 this.Hide(); new Frm_Management().ShowDialog(); this.Close();
- Linux网络流量控制工具—Netem
第一篇:概念篇 Netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块.该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽.传输延迟.丢包等等情况.使 ...
- js中什么是闭包?
闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.
- [Web] 如何实现Web服务器和应用服务器的负载均衡?
本文对Web服务器和应用服务器的负载均衡进行说明. 在负载均衡的思路下,多台服务器为对称方式,每台服务器都具有同等的地位,可以单独对外提供服务而无须其他服务器的辅助.通过负载分担技术,将外部发送来的请 ...