上一篇
简单的说明了为什么要使用NoSQL。接下来我们看下如何把NoSQL引入到我们的项目中,我们到底要不要把NoSQL引入到项目中。
在过去,我们只需要学习和使用一种数据库技术,就能做几乎所有的数据库应用开发。因为成熟稳定的关系数据库产品并不是很多,而供你选择的免费版本就
更加少了,所以互联网领域基本上都选择了免费的MySQL数据库。在高速发展的WEB2.0时代,我们发现关系数据库在性能、扩展性、数据的快速备份和恢
复、满足需求的易用性上并不总是能很好的满足我们的需要,我们越来越趋向于根据业务场景选择合适的数据库,以及进行多种数据库的融合运用。几年前的一篇文
章《One Size Fits All - An Idea Whose Time Has Come and Gone
》就已经阐述了这个观点。
当我们在讨论是否要使用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来作为我们的存储呢?这并不是一个很好回答的问题,影响我们选择的因素有很多,而选择也可能有多种,随着业务场景,需求的变更可能选择又会变化。我们常常需要根据如下情况考虑:
- 数据结构特点。包括结构化、半结构化、字段是否可能变更、是否有大文本字段、数据字段是否可能变化。
- 写入特点。包括insert比例、update比例、是否经常更新数据的某一个小字段、原子更新需求。
- 查询特点。包括查询的条件、查询热点的范围。比如用户信息的查询,可能就是随机的,而新闻的查询就是按照时间,越新的越频繁。
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架构的时候,你也会碰到上面的问题,所以这里没有阐述。
关于作者
孙立,目前在凤凰网负责底层组的研发工作。曾就职于搜狐和ku6。多年互联网从业经验和程序开发,对分布式搜索引擎的开发,高并发,大数据量网站系
统架构优化,高可用性,可伸缩性,分布式系统缓存,数据库分表分库(sharding)等有丰富的经验,并且对运维监控和自动化运维控制有经验。开源项目
phplock,phpbuffer的作者。近期开发了一个NOSQL数据库存储INetDB,是NoSQL数据库爱好者。他的新浪微博是:http://t.sina.com.cn/sunli1223
分享到:
相关推荐
在选择数据库时,关系数据库与NoSQL数据库都有其独特的适用场景和优缺点。关系数据库,如MySQL,以其ACID(原子性、一致性、隔离性和持久性)特性、强大的SQL查询语言和成熟的理论基础,被广泛应用于需要强一致性、...
关系型数据库和NOSQL数据库在应用设计上存在显著差异,这些差异主要来源于它们各自的设计理念、存储方式、数据模型和优化策略等方面。为了深入理解这些差异,我们可以从HBase的应用实践入手,进行分析和对比。 ...
关系型数据库与NoSQL数据库 关系型数据库是支持关系模型的数据库系统,是目前各类数据库中最重要,也是使用最广泛的数据库系统。关系型数据库从诞生到现在经过几十年的发展,已经变的比较成熟,目前市场上主流的...
MongoDb是非关系型数据库的一种,它是一种基于分布式的文档型数据库。
NoSQL数据库摒弃了传统关系型数据库的设计理念,如固定的表结构和复杂的事务处理机制,转而采取更为灵活的数据模型和支持水平扩展的技术方案。 #### NoSQL兴起的原因 NoSQL的兴起主要归因于传统关系型数据库无法...
二.NoSQL数据库的产生 关系数据库面临挑战 关系数据库面对超大规模和高并发的SNS类型的web2.0纯动态网站显得力不从心,暴露了很多难以克服的问题 A 大数据发展 大规模数据集合,多重数据带来了许多挑战,尤其是...
分布式Key-Value键值数据库与关系数据库NoSQL的对比及发展趋势 随着云计算和大数据时代的到来,传统的关系数据库(RDBMS)受到了来自非关系型数据库(NoSQL)的挑战,尤其是分布式Key-Value键值数据库。NoSQL的兴起...
NoSQL数据库强调分布式、水平扩展、高可用性和大数据处理能力,它放弃了传统的关系模型,采用了诸如键值对、文档型、列族和图形等多种非关系型数据模型,以适应不同的应用场景。NoSQL数据库通常不支持SQL,而是提供...
关系型数据库与NOSQL数据库的应用场景 关系型数据库和NOSQL数据库是现代数据库系统的两大类型,它们各有优劣,在不同应用场景下有着不同的适用性。理解关系型数据库和NOSQL数据库的特点、优劣和应用场景,可以帮助...
NoSQL数据库通常具有高扩展性、灵活的数据模型和较低的延迟,但可能牺牲部分ACID特性,采用最终一致性模型。 数据建模是设计数据库结构的过程,包括实体-关系(ER)模型、概念数据模型和逻辑数据模型。在ER模型中,...
空间数据库技术应用:关系数据库的设计.pptx
关系数据库和NoSQL数据库操作比较实验报告 实验目的:了解四种数据库(MySQL、HBase、Redis、MongoDB)的概念和不同点,熟悉使用四种数据库操作常用的Shell命令和Java API。 实验平台:Linux操作系统,Hadoop版本...
NoSQL数据库技术发展趋势 NoSQL数据库技术发展趋势是当前数据库技术发展的热点。近年来,NoSQL数据库技术获得了高速发展,许多企业和机构都在投入巨资来开发和应用NoSQL数据库技术。阿里云作为中国软件行业的领导者...
《大数据技术基础》课程的第五章重点探讨了NoSQL数据库,并通过上机练习来深化学生对关系数据库和NoSQL数据库的理解。在这个环节中,学生将有机会实际操作四种不同类型的数据存储系统:MySQL(关系型数据库)、Redis...
对于NoSQL数据库HBase、Redis和MongoDB,虽然没有提供具体的操作步骤,但通常它们的使用包括安装相应的客户端工具,学习其特定的命令行语法或者Java API,例如HBase的HBase Shell、Redis的`redis-cli`和MongoDB的...
分布式key-value键值数据库与关系数据库NoSql 在当前的数据库市场中,关系数据库(RDBMS)占据着统治地位,提供了简单性、健壮性、灵活性、性能和可伸缩性等优点。但是,随着应用程序的增长和云计算的普及,关系...
NoSQL数据库的设计理念与传统的关系型数据库不同,它不依赖于固定的表结构和预定义的数据模式。这种设计使得NoSQL数据库能够灵活地存储和管理各种不同类型的数据,非常适合处理大数据和分布式环境中的数据存储需求。...
在当今大数据时代,传统的SQL关系型数据库已经无法满足海量数据的存储和处理需求,因此分布式数据库和NoSQL数据库应运而生。本课件将深入探讨分布式数据库的原理以及NoSQL数据库的核心概念,帮助读者理解和掌握这两...
技术关键词: SQL、关系数据库、NoSQL 内容关键词: 数据建模、查询优化、事务处理 用途: 理解数据存储和管理的基本原理,确保数据的有效性和安全性 资源描述: "MySQL官方文档"提供了MySQL数据库的详尽文档和教程,...