热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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 数据库概览及其与 SQL 语法的比较

 

四、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 <

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' for list of supportedcommands.

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


推荐阅读
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 小程序的授权和登陆
    小程序的授权和登陆 ... [详细]
  • 在OpenShift上部署基于MongoDB和Node.js的多层应用程序
    本文档详细介绍了如何在OpenShift 4.x环境中部署一个包含MongoDB数据库和Node.js后端及前端的多层应用程序。通过逐步指导,读者可以轻松完成整个部署过程。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 为了确保数据库的高效运行,本文介绍了一种方法,通过编写定时任务脚本来自动清理 `order` 表中状态为 0 或为空的无效订单记录。该脚本使用 PHP 编写,并设置时区为中国标准时间,每 10 分钟执行一次,以保持数据库的整洁和性能优化。此外,还详细介绍了如何配置定时任务以及脚本的具体实现步骤。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
author-avatar
婷婷爱BB
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有