关系数据库还是NoSQL数据库(转)

上一篇 / 下一篇  2013-09-21 15:39:42 / 个人分类:数据库

F-AH+s1n&wP!@#q0原文链接:

__p.{_7i!O051Testing软件测试网L |jEs Rt

 http://www.infoq.com/cn/news/2011/01/relation-db-nosql-db51Testing软件测试网 TSS0SFs

~c5Cy {7WS:}0在过去,我们只需要学习和使用一种数据库技术,就能做几乎所有的数据库应用开发。因为成熟稳定的关系数据库产品并不是很多,而供你选择的免费版本就更加少了,所以互联网领域基本上都选择了免费的MySQL数据库。在高速发展的WEB2.0时代,我们发现关系数据库在性能、扩展性、数据的快速备份和恢复、满足需求的易用性上并不总是能很好的满足我们的需要,我们越来越趋向于根据业务场景选择合适的数据库,以及进行多种数据库的融合运用。几年前的一篇文章One Size Fits All - An Idea Whose Time Has Come and Gone》就已经阐述了这个观点。51Testing软件测试网 flK.R T0ZtD

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

,T(O})f g/X F ?+T0

NoSQL的分类

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

aM{%K4} o0类型51Testing软件测试网:[0G5m/BW{ u

{*Xv/tPS b0部分代表51Testing软件测试网sw;iC D f

~F(_BJB4]S)F0特点

!Ix1u#Lu0
51Testing软件测试网(FF;^!|7QL$} j

列存储

8J6XY5?9? E^$F,h0

7kn]"C)g0Hbase51Testing软件测试网&F5q|"K1A3}9J(HW$R+f

51Testing软件测试网6r7| a"[ P6I

Cassandra51Testing软件测试网9px(Y#pk c;s

P|m8s3v3n0Hypertable

-Q(VY7f#h*| f.h0
51Testing软件测试网nX ZD^u/[ ui r

顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。51Testing软件测试网a:^5N Xr|

51Testing软件测试网0z3\%e*fA!xm1~ ?

文档存储

.n$HHx_-O0

k[&J!H A'|$j I|i0MongoDB

5mW+ROD.n~051Testing软件测试网#wrJF#{S4b{?

CouchDB51Testing软件测试网a$x x8~Zn0pC

51Testing软件测试网'}$l]J9l X d)[

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

)O`hs }0

4O6h"w&b6D+\-eN6S@A0key-value存储51Testing软件测试网 tz-@{N'W A

]ql~3wcNZ.Q6C0Tokyo Cabinet / Tyrant51Testing软件测试网%l*^V&J W7fDGh+U

]}wV9_!Y0Berkeley DB51Testing软件测试网q?$w)T*t!M2N/T'|

51Testing软件测试网 SN-U h{!D'`*l S _.E)?h

MemcacheDB51Testing软件测试网G7Gy\&y

~(ACs:M4G0Redis51Testing软件测试网!k1yW ET |Z

-JC i%x'S3j!J0可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)51Testing软件测试网o| ]t.w j

51Testing软件测试网y P1G:Y6K`.e

图存储

Hf\b!G]F+\(]0

C1E\AV'yj0Neo4J51Testing软件测试网4}#a6f+jcMINO,x K

mFTL5}H3h0FlockDB51Testing软件测试网ClQ.i [1G ^

/V8wM'^jy [0图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。51Testing软件测试网;g0E3K6^&D"{

51Testing软件测试网 OF3z N[3Hj

对象存储

p$yZ})Q[Dm.x.k0
51Testing软件测试网6l$iS&ORlF

db4o

-O+h}\Pvh0

oq+r-{ Pb'~ J&y)[.HQb0Versant51Testing软件测试网4zQn\M7M7IB Q

51Testing软件测试网:_-bvBa J5k

通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。51Testing软件测试网T8ea\T

n:hn"@r ~0xml数据库51Testing软件测试网8B3|.X&NLd d*NQ

,JS(U*{#BuM`:i4F0Berkeley DB XML

2T9}2D!Ma4j051Testing软件测试网-gc.[E(NVS%q

BaseX

5v [QJ7|*V1\&a/n0

4Z%_Y[}0高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。51Testing软件测试网8}9n%y^U0]shjy

1_Yj+P9L oN-G%U0

,r6Cay3a&EL/p0以上NoSQL数据库类型的划分并不是绝对,只是从存储模型上来进行的大体划分。它们之间没有绝对的分界,也有交差的情况,比如Tokyo Cabinet / Tyrant的Table类型存储,就可以理解为是文档型存储,Berkeley DB XML数据库是基于Berkeley DB之上开发的。51Testing软件测试网I+gBZ'_

NoSQL还是关系数据库

mi9?*@ET,E B lV%L0虽然09年出现了比较激进的文章《关系数据库已死》,但是我们心里都清楚,关系数据库其实还活得好好的,你还不能不用关系数据库。但是也说明了一个事实,关系数据库在处理WEB2.0数据的时候,的确已经出现了瓶颈。51Testing软件测试网!Qq*\3GJ2O J?

51Testing软件测试网Q6`*oMMCP$?

那么我们到底是用NoSQL还是关系数据库呢?我想我们没有必要来进行一个绝对的回答。我们需要根据我们的应用场景来决定我们到底用什么。51Testing软件测试网d!?ea.C

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

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

选择合适的NoSQL

HXU B.\^d)T.E0如此多类型的NoSQL,而每种类型的NoSQL又有很多,到底选择什么类型的NoSQL来作为我们的存储呢?这并不是一个很好回答的问题,影响我们选择的因素有很多,而选择也可能有多种,随着业务场景,需求的变更可能选择又会变化。我们常常需要根据如下情况考虑:51Testing软件测试网3NQ T]J,q3~&yGY

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

NoSQL和关系数据库结合

s MM8\,b0其实NoSQL数据库仅仅是关系数据库在某些方面(性能,扩展)的一个弥补,单从功能上讲,NoSQL的几乎所有的功能,在关系数据库上都能够满足,所以选择NoSQL的原因并不在功能上。51Testing软件测试网W\@,^Et^

+B%\*lf#vA i;F0所以,我们一般会把NoSQL和关系数据库进行结合使用,各取所长,需要使用关系特性的时候我们使用关系数据库,需要使用NoSQL特性的时候我们使用NoSQL数据库,各得其所。

8FD*G jV{0HpQ0

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

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

NoSQL代替MySQL

*u/p J+W#H0在某些应用场合,比如一些配置的关系键值映射存储、用户名和密码的存储、Session会话存储等等,用NoSQL完全可以替代MySQL存储。不但具有更高的性能,而且开发也更加方便。51Testing软件测试网)f8}}tDCwh6K

NoSQL作为缓存服务器

51Testing软件测试网 ?!C%b9o%B x

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

0bLhES \0

2T"Rs&G7g f&UWH I0NoSQL数据库一般都具有非常高的性能,在大多数场景下面,你不必再考虑在代码层为NoSQL构建一层Memcached缓存。NoSQL数据本身在Cache上已经做了相当多的优化工作。51Testing软件测试网2f*@ Q*K1Q az!l f

0f|+I6YSZVO0Memcached这类内存缓存服务器缓存的数据大小受限于内存大小,如果用NoSQL来代替Memcached来缓存数据库的话,就可以不再受限于内存大小。虽然可能有少量的磁盘IO读写,可能比Memcached慢一点,但是完全可以用来缓存数据库的查询操作。51Testing软件测试网0Bk-o)rzO @A1y|

规避风险

51Testing软件测试网M] D.V z

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

m"a E)S;AL W'a|051Testing软件测试网#h&Oq`q:p B

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

总结

51Testing软件测试网5w ng5H'P4B!Z){3R.oY

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


TAG:

 

评分:0

我来说两句

Open Toolbar