上一篇简单的说明了为什么要使用NoSQL。接下来我们看下如何把NoSQL引入到我们的项目中,我们到底要不要把NoSQL引入到项目中。

在过去,我们只需要学习和使用一种数据库技术,就能做几乎所有的数据库应用开发。因为成熟稳定的关系数据库产品并不是很多,而供你选择的免费版本就更加少了,所以互联网领域基本上都选择了免费的MySQL数据库。在高速发展的WEB2.0时代,我们发现关系数据库在性能、扩展性、数据的快速备份和恢复、满足需求的易用性上并不总是能很好的满足我们的需要,我们越来越趋向于根据业务场景选择合适的数据库,以及进行多种数据库的融合运用。

当我们在讨论是否要使用NoSQL的时候,你还需要理解NoSQL也是分很多种类的,在NoSQL百花齐放的今天,NoSQL的正确选择比选择关系数据库还具有挑战性。虽然NoSQL的使用很简单,但是选择却是个麻烦事,这也正是很多人在观望的一个原因。

NoSQL的分类

NoSQL仅仅是一个概念,NoSQL数据库根据数据的存储模型和特点分为很多种类。

类型

部分代表

特点

列存储

Hbase

Cassandra

Hypertable

顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。

文档存储

MongoDB

CouchDB

文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。

key-value存储

Tokyo Cabinet / Tyrant

Berkeley DB

MemcacheDB

Redis

可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)

图存储

Neo4J

FlockDB

图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。

对象存储

db4o

Versant

通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。

xml数据库

Berkeley DB XML

BaseX

高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。

以上NoSQL数据库类型的划分并不是绝对,只是从存储模型上来进行的大体划分。它们之间没有绝对的分界,也有交差的情况,比如Tokyo Cabinet / Tyrant的Table类型存储,就可以理解为是文档型存储,Berkeley DB XML数据库是基于Berkeley DB之上开发的。

NoSQL还是关系数据库

虽然09年出现了比较激进的文章《关系数据库已死》,但是我们心里都清楚,关系数据库其实还活得好好的,你还不能不用关系数据库。但是也说明了一个事实,关系数据库在处理WEB2.0数据的时候,的确已经出现了瓶颈。

那么我们到底是用NoSQL还是关系数据库呢?我想我们没有必要来进行一个绝对的回答。我们需要根据我们的应用场景来决定我们到底用什么。

如果关系数据库在你的应用场景中,完全能够很好的工作,而你又是非常善于使用和维护关系数据库的,那么我觉得你完全没有必要迁移到NoSQL上面,除非你是个喜欢折腾的人。如果你是在金融,电信等以数据为王的关键领域,目前使用的是Oracle数据库来提供高可靠性的,除非遇到特别大的瓶颈,不然也别贸然尝试NoSQL。

然而,在WEB2.0的网站中,关系数据库大部分都出现了瓶颈。在磁盘IO、数据库可扩展上都花费了开发人员相当多的精力来优化,比如做分表分库(database sharding)、主从复制、异构复制等等,然而,这些工作需要的技术能力越来越高,也越来越具有挑战性。如果你正在经历这些场合,那么我觉得你应该尝试一下NoSQL了。

选择合适的NoSQL

如此多类型的NoSQL,而每种类型的NoSQL又有很多,到底选择什么类型的NoSQL来作为我们的存储呢?这并不是一个很好回答的问题,影响我们选择的因素有很多,而选择也可能有多种,随着业务场景,需求的变更可能选择又会变化。我们常常需要根据如下情况考虑:

  1. 数据结构特点。包括结构化、半结构化、字段是否可能变更、是否有大文本字段、数据字段是否可能变化。
  2. 写入特点。包括insert比例、update比例、是否经常更新数据的某一个小字段、原子更新需求。
  3. 查询特点。包括查询的条件、查询热点的范围。比如用户信息的查询,可能就是随机的,而新闻的查询就是按照时间,越新的越频繁。

NoSQL和关系数据库结合

其实NoSQL数据库仅仅是关系数据库在某些方面(性能,扩展)的一个弥补,单从功能上讲,NoSQL的几乎所有的功能,在关系数据库上都能够满足,所以选择NoSQL的原因并不在功能上。

所以,我们一般会把NoSQL和关系数据库进行结合使用,各取所长,需要使用关系特性的时候我们使用关系数据库,需要使用NoSQL特性的时候我们使用NoSQL数据库,各得其所。

举个简单的例子吧,比如用户评论的存储,评论大概有主键id、评论的对象aid、评论内容content、用户uid等字段。我们能确定的是评论内容content肯定不会在数据库中用where content=’’查询,评论内容也是一个大文本字段。那么我们可以把 主键id、评论对象aid、用户id存储在数据库,评论内容存储在NoSQL,这样数据库就节省了存储content占用的磁盘空间,从而节省大量IO,对content也更容易做Cache。

//从MySQL中查询出评论主键id列表
commentIds=DB.query("SELECT id FROM comments where aid='评论对象id' LIMIT 0,20");
//根据主键id列表,从NoSQL取回评论实体数据
CommentsList=NoSQL.get(commentIds);

NoSQL代替MySQL

在某些应用场合,比如一些配置的关系键值映射存储、用户名和密码的存储、Session会话存储等等,用NoSQL完全可以替代MySQL存储。不但具有更高的性能,而且开发也更加方便。

NoSQL作为缓存服务器

MySQL+Memcached的架构中,我们处处都要精心设计我们的缓存,包括过期时间的设计、缓存的实时性设计、缓存内存大小评估、缓存命中率等等。

NoSQL数据库一般都具有非常高的性能,在大多数场景下面,你不必再考虑在代码层为NoSQL构建一层Memcached缓存。NoSQL数据本身在Cache上已经做了相当多的优化工作。

Memcached这类内存缓存服务器缓存的数据大小受限于内存大小,如果用NoSQL来代替Memcached来缓存数据库的话,就可以不再受限于内存大小。虽然可能有少量的磁盘IO读写,可能比Memcached慢一点,但是完全可以用来缓存数据库的查询操作。

规避风险

由于NoSQL是一个比较新的东西,特别是我们选择的NoSQL数据库还不是非常成熟的产品,所以我们可能会遇到未知的风险。为了得到NoSQL的好处,又要考虑规避风险,鱼与熊掌如何兼得?

现在业内很多公司的做法就是数据的备份。在往NoSQL里面存储数据的时候还会往MySQL里面存储一份。NoSQL数据库本身也需要进行备份(冷备和热备)。或者可以考虑使用两种NoSQL数据库,出现问题后可以进行切换(避免出现digg使用Cassandra的悲剧)。

总结

本文只是简单的从MySQL和NoSQL的角度分析如何选择,以及进行融合使用。其实在选择NoSQL的时候,你可能还会碰到关于CAP原则,最终一致性,BASE思想的考虑。因为使用MySQL架构的时候,你也会碰到上面的问题,所以这里没有阐述。

原文地址:http://www.infoq.com/cn/news/2011/01/relation-db-nosql-db

关系数据库还是NoSQL数据库相关推荐

  1. NoSQL数据库-MongoDB和Redis

    NoSQL数据库-MongoDB和Redis   发布于2012-12-20,来源:比特网   1NoSQL简述 CAP(Consistency,Availabiity,Partitiontolera ...

  2. 第七章-NoSQL数据库

    第七章-NoSQL数据库 文章目录 第七章-NoSQL数据库 NoSQL简介 NoSQL VS. 关系数据库 NoSQL的四大类型 键值数据库 列族数据库 文档数据库 图形数据库 不同类型数据库比较 ...

  3. 什么是 NoSQL 数据库、NoSQL 与 SQL 的区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. NoSQL 数据库是针对可扩展性能和无架构数据模型进行了优化的非关系数据库. NoSQL 数据库也因 ...

  4. 大数据技术原理与应用(林子雨)-NoSQL数据库单元测验

    1单选(2分) 下列关于NoSQL数据库和关系型数据库的比较,不正确的是得分/总分 A. NoSQL数据库缺乏统一的查询语言,而关系型数据库有标准化查询语言 B. NoSQL数据库具有弱一致性,关系型 ...

  5. 浅析关系数据库和NoSql非关系数据库

    1 关系数据库  1.1 关系数据库的简介  支持关系模型的数据库系成之为关系数据库,是目前各类数据库中使用最为广泛的数据库系统.关系数据库在经过二十几年的发展,已经变的功能强大,使用广泛,产品成熟的 ...

  6. 大数据技术原理与应用——NoSQL数据库

    大数据技术原理与应用--NoSQL数据库 5.1 NoSQL 简介 特点 1.灵活的可扩展性 传统的关系型数据库由于自身设计机理的原因,通常很难实现"横向扩展",在面对数据库负载大 ...

  7. 数据库入门:如何选择SQL和NoSQL数据库

    数据是数据科学所有子领域的基础.无论您要建造的产品用途如何,都需要获取和分析数据.通常,您需要的这些数据存储在DBMS(数据库管理系统)中. 本文来自<数据黑客>,登录官网可精彩资讯和文章 ...

  8. 大数据开发学习:NoSQL数据库入门

    大数据处理,涉及到从数据获取到数据存储.数据计算的诸多环节,各个环节需要解决的问题不同,相关岗位要求的技能也不同.在数据存储阶段,对数据库选型是非常重要的一项工作.今天的大数据开发学习分享,我们就来聊 ...

  9. 大数据数据库选型:NoSQL数据库入门

    大数据处理,涉及到从数据获取到数据存储.数据计算的诸多环节,各个环节需要解决的问题不同,相关岗位要求的技能也不同.在数据存储阶段,对数据库选型是非常重要的一项工作.今天的大数据数据库培训分享,我们就来 ...

最新文章

  1. SAP PP为工单创建好HU之后,如何查询HU号码?
  2. 顺子对百录收录的看法
  3. Zookeeper内部的简单细节(一)
  4. CSS文件可维护、可读性提高指南第2/2页
  5. 【ASP.NET开发】.NET三层架构简单解析
  6. 2020年周记(1/50)
  7. mysql数据库中文显示_关于Mysql数据库中文显示问题
  8. java 工厂化生产
  9. JS框架设计之对象类型判断一种子模块
  10. [转载] c++ iterator 失效_C++ STL迭代器失效问题
  11. 对称 symmetric
  12. 图的遍历之深度优先搜索和广度优先搜索
  13. 【信息系统项目管理师】项目管理十大知识领域速记
  14. mac安装应用提示已损坏的解决方法
  15. 使用Typora编辑器编写md文档插入图片方法
  16. mysql dba高级教程_MySQL DBA高级视频教程 博瑞森一线DBA大神亲授
  17. powershell过滤查询结果
  18. 网络电视(IPTV)系统解决方案
  19. 公众号 自动生成海报 python_Python 生成公众号头图 1.0
  20. python unzip解压缩_Python压缩和解压缩文件(zip/unzip)

热门文章

  1. 计算机主机名称命令,怎么用dos指令修改计算机名
  2. 基于云原生2.0,华为云沃土云创计划全面使能伙伴创新升级
  3. IDA python 脚本编程使用参考资料链接
  4. 九度 OJ 1451 错排 动规
  5. (王道408考研数据结构)第一章绪论-第一节:数据结构的基本概念、三要素、逻辑结构和物理结构
  6. (王道408考研操作系统)第二章进程管理-第一节1:进程、PCB及其特征
  7. 全面介绍Windows内存管理机制及C++内存分配实例(五):堆
  8. Qt之格栅布局(QGridLayout)
  9. 33. 脱壳篇-重建输入表
  10. 弄明白python reduce 函数