【文章摘要

HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。同一时候也是知名的NoSQL数据库之中的一个。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数据库分析

分类

数据模型

长处

缺点

典型应用场景

键值(Key-Value)存储数据库

Key指向Value的键值对,通经常使用hash表来实现

查找速度快

数据无结构化(通常只被当作字符串或者二进制数据)

内容缓存。主要用于处理大量数据的高訪问负载,也用于一些日志系统等

列存储数据库

以列簇式存储,将同一列数据存在一起

查找速度快,可扩展性强,更easy进行分布式扩展

功能相对局限

分布式的文件系统

文档型数据库

Key-Value相应的键值对,Value为结构化数据

数据结构要求不严格。表结构可变(不须要像关系型数据库一样需预先定义表结构)

查询性能不高,并且缺乏统一的查询语法

Web应用

图形(Graph)数据库

图结构

利用图结构相关算法(如最短路径寻址,N度关系查找等)

非常多时候须要对整个图做计算才干得出须要的信息,并且这样的结构不太好做分布式的集群方案

社交网络,推荐系统等

四、NoSQL的特征

NoSQL数据库并没有一个统一的架构。可是它们都普遍存在表2所看到的的一些共同特征。

表2 NoSQL的特征

特征

描写叙述

不须要提前定义模式

不需事先定义数据模式,提前定义表结构等。数据中每条记录都可能有不同的属性和格式

无共享架构

NoSQL往往将数据划分后存储在各个本地server上。从而提高了系统的性能

弹性可扩展

能够在系统运行的时候,动态添加或者删除结点。不须要停机维护。数据能够自己主动迁移

分区

NoSQL数据库将数据进行分区,将记录分散在多个节点上面。并且通常分区的同一时候还要做复制

异步复制

NoSQL中的复制,往往是基于日志的异步复制。

这样,数据就能够尽快地写入一个节点,而不会出现网络传输拖延

BASE

相对于ACID特性,NoSQL数据库保证的是BASE特性(BASE是终于一致性和软事务)

五、常见的NoSQL数据库

比較适合採用NoSQL数据库的场合是:(1)数据模型比較简单。(2)须要灵活性更强的IT系统。(3)对数据库性能要求较高。(4)不须要高度的数据一致性;(5)对于给定key,比較easy映射复杂值的环境。

常见的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数据库的明天会更加的美好!

-------------------------

本人微信公众号:zhouzxi,请扫描以下二维码:

NoSQL数据库概览及其与SQL语法的比較的更多相关文章

  1. NoSQL 数据库概览及其与 SQL 语法的比较

    NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用的难题. 本文对NoSQL数据库的定义.分类.特征.当前比较流行的NoSQL数据库系统等进行了简单的介绍,并对N ...

  2. 【一个idea】YesSql,一种在经典nosql数据库redis上实现SQL引擎的方案(我就要开历史的倒车)

    公众号链接 最高级的红酒,一定要掺上雪碧才好喝. 基于这样的品味,我设计出了一套在经典nosql数据库redis上实现SQL引擎的方法.既然redis号称nosql,而我偏要把SQL加到redis上, ...

  3. mysql用户授权、数据库权限管理、sql语法详解

    mysql用户授权.数据库权限管理.sql语法详解 —— NiceCui 某个数据库所有的权限 ALL 后面+ PRIVILEGES SQL 某个数据库 特定的权限SQL mysql 授权语法 SQL ...

  4. MySql数据库的一些基本操作---------------SQL语法

    MySql数据库是比较常用的关系型数据库,操作用的是sql语句,下面来说一说MySql的一些基本操作 MySql数据库是一种C/S型的模式,即客户端/服务器端,对应到具体应用上,便是bin目录下的my ...

  5. 告诉你 SQL 数据库与 NoSQL 数据库的区别

    简单来说 SQL 数据库和 NoSQL 数据库有着共同的目标:存储数据,但存储的方式不同 一. 表 SQL中的表结构具有严格的数据模式约束: 存储数据很难出错. NoSQL存储数据更加灵活自由:可能导 ...

  6. MySQL的操作数据库SQL语法

    MySQL的操作数据库SQL语法 顺序:操作数据库 > 操作数据库中的表 > 操作数据库中的表的数据 MySQL不区分大小写字母 1. 操作数据库 1.创建数据库 2.删除数据库 3.使用 ...

  7. 技术分享|SQL和 NoSQL数据库之间的差异:MySQL(VS)MongoDB

    在当今市场上,存在各种类型的数据库,选择适合你业务类型的数据库对应用的开发和维护有着重要意义.本篇文章,将为大家分享SQL和NoSQL语言之间的区别,同时还将比较这两种类型的数据库,以帮助小伙伴们选择 ...

  8. 常用数据库2 sqlite及SQL注入

    知识内容: 1.sqlite数据库介绍 2.sqlite数据库操作 3.SQL注入 一.sqlite数据库介绍 1.sqlite数据库 sqlite数据库:轻量级的数据库,一般开发中使用sqlite数 ...

  9. NoSQL数据库的认识

    SQL数据库和NoSQL数据库介绍 什么是SQL数据库? 关系型数据库是依据关系模型来创建的数据库.而所谓的关系模型就是“一对一.一对多.多对多”等关系模型,这是一种二维表格模型,因此一个关系型数据库 ...

随机推荐

  1. SpringMVC 控制器统一异常处理

    摘要介绍spring mvc控制器中统一处理异常的两种方式:HandlerExceptionResolver以及@ExceptionHandler:以及使用@ControllerAdvice将@Exc ...

  2. 【java】查重类的实现

    import java.util.Vector; public class ElementCheck { // 重复优先 static Vector<Integer> CheckSameE ...

  3. html引用ttf字体文件

    在样式表如此定义: @font-face { font-family: MyFontName;//自定义字体名称 src: url(../Gloss_And_Bloom.ttf) } 然后,具体使用: ...

  4. Codeforces Round #569 题解

    Codeforces Round #569 题解 CF1179A Valeriy and Deque 有一个双端队列,每次取队首两个值,将较小值移动到队尾,较大值位置不变.多组询问求第\(m\)次操作 ...

  5. 检查sql对象是否存在

    SQL Server判断对象是否存在   1 判断数据库是否存在 Sql代码  if exists (select * from sys.databases where name = '数据库名')  ...

  6. python清除字符串中无用字符

    将列表val_list中包含的非法字符去掉,illegal_char是非法字符列表 def clear(): illegal_char = [' ','#','%','_','@'] tmp_list ...

  7. 2019ICPC西安邀请赛(计蒜客复现赛)总结

    开始时因为吃饭晚了一刻钟,然后打开比赛.看了眼榜单A题已经过了二十来个队伍了,宝儿就去做A. 传师说最后一题看题目像最短路,于是我就去看M了,宝儿做完之后也来陪我看.M一开始看到时以为是像   POJ ...

  8. mysql主库与从库配置(并行复制配置)

    主库: [mysqld] server-id = 2233port = 13306basedir = /usr/local/mysqldatadir = /usr/local/mysql/data s ...

  9. Python数据类型之数字类型

    整数 在Python中,整数可以执行 加(+)减(-)乘(*)除(/) 运算. 1 + 2 3 - 2 2 * 3 3 / 2 # 1.5 在控制台,Python直接返回运算结果. Python中也可 ...

  10. Python之使用eval()函数将字符串的数据结构提取出来

    data = input('请输入你要修改的对象:').strip() ''' 输入下面的字典列表 [{'backend':'www.oldboy1.org','record':{'server':' ...