在过去,我们只需要学习和使用一种数据库技术,就能做几乎所有的数据库应用开发。因为成熟稳定的关系数据库产品并不是很多,而供你选择的免费版本就更加少了,所以互联网领域基本上都选择了免费的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
如此多类型的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架构的时候,你也会碰到上面的问题,所以这里没有阐述。
转自:http://www.cnblogs.com/sunli/archive/2011/01/24/nosql_or_relation.html
分享到:
相关推荐
算法的选择 Quorum NRW Vector clock Virtual node gossip Gossip (State Transfer Model) Gossip (Operation Transfer Model) Merkle tree Paxos 背景 DHT Map Reduce Execution Handling Deletes 存储实现 节点...
NoSQL系列:选择合适的数据库 为什么使用NoSQL数据库? 1、阻抗失衡 关系模型和内存中的数据结构不匹配 采用更为方便的数据交互方式提升开发效率 2、待处理的数据量很大 数据量超过关系型数据库的...
那么,就让我们先来看一看关系型数据库的历史、分类和特征吧。 关系型数据库简史 1969年,埃德加•弗兰克•科德(Edgar Frank Codd)发表了划时代的论文,首次提出了关系数据模型的概念。但可惜的是,刊登论文的...
3 算法的选择 3 Quorum NRW 3 Vector clock 3 Virtual node 3 gossip 3 Gossip (State Transfer Model) 3 Gossip (Operation Transfer Model) 3 Merkle tree 3 Paxos 3 背景 3 DHT 3 Map Reduce Execution 3 ...
用分类和统一的观点重点研究了各类NoSQL系统,在系统架构、数据模型、查询语言、扩展性及可用性等方面对它们进行了比较,以便根据给定的不同应用场景来选择和设计最合适的系统;最后展望了未来的研究前景.
以下是 MySQL 面试题的一些分类,完整内容见压缩文件: 1. 基础知识:包括 MySQL 数据库的基本概念、SQL 命令、数据类型、索引、视图、存储过程等。 2. 性能优化:包括 SQL 查询优化、索引优化、数据表分区、缓存...
数据库的分类 数据库可以分为关系型数据库和非关系型数据库两大类。 关系型数据库是指存储的格式可以直观地反映实体间的关系的数据库。关系型数据库和常见的表格比较相似,关系型数据库中表与表之间是有很多复杂的...
数据库方面可能涉及SQL或NoSQL技术用于维护用户上传的图片信息。作为一个可二次开发的功能包,这意味着源码是开放且模块化的,允许学生或开发者根据自己的需求进行定制和扩展。例如,可以在现有的基础上增加图片压缩...
如果您下载了本程序,但是该程序存在问题无法运行,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用的)。另外,您不会使用资源的话(这种情况不支持退款),也可以找我们帮助(需要...
3. 搜索与筛选:用户可以通过关键词、作者、分类等多种方式搜索书籍,并根据需要对结果进行筛选和排序。 4. 书籍共享:用户可以将自己的书籍添加到系统中共享给其他用户,也可以借阅他人共享的书籍。 5. 借阅管理...
1. 商品浏览:用户可以方便地浏览商品分类、搜索商品,查看商品详情和评价。 2. 购物车管理:用户能够添加商品到购物车、修改购物车内商品数量,以及删除不需要的商品。 3. 订单处理:用户可以选择支付方式下单...
分类 Learning Golang 知识清单 基础 变量 常量 类型 函数 包 数组 切片 指针 结构 方法 接口 协程 信道 缓冲区 选择 互斥锁 延迟 错误 异常 恢复 text image compress container crypto encoding unicode io net ...
- 文章可选择分类和标签,自定义url - 文章可控制是否允许评论 - 文章管理 - 以列表形式展示文章信息 - 在可选操作中增加删除,预览,编辑功能 - 支持分页显示 - 增加搜索功能,可根据文章名文章信息 - 分类...
1. 用户可根据自己的身份,选择不同的账本类别。 2. 用户可智能语音记账。 3. 有用户收支记录,用户可自己分类。 4. 根据收支变化,App 自动生成统计图。 5. 用户可自己设置“心愿单”板块,为自己设置某段时间内的...
⼤数据实践之数据建模 随着DT时代互联⽹、智能设备及其他信息技术的发展,数据爆发式增长,如何将这些数据进⾏有序、有结构地分类组织和存储是我们⾯临的⼀个挑战。 为什么需要数据建模 如果把数据看作图书馆⾥的书...
NoSQL的来源、主要特征和适用场景 4.1.3分布式文件系统 Google分布式文件系统(GFS) Google分布式计算框架(MR) Google Bigtable Database 4.2大数据应用 对企业大数据应用的理解 大数据流式计算技术解析之...
一个使用OCR和图像识别将图像添加,删除和分类的地方! 特征 -用户可以创建一个帐户来存储他们的图像/文件! -Web应用程序的前端具有响应能力! -用户选择的图像将上传到Firebase Storage / Google Cloud ...
分类列表、分类详情 品牌列表、品牌详情 新品首发、人气推荐 优惠券列表、优惠券选择 团购 搜索 商品详情、商品评价、商品分享 购物车 下单 订单列表、订单详情、订单售后 地址、收藏、足迹、意见反馈 客服 管理平台...
│ Java面试题81:微信公众号分类和微信开发原理.mp4 │ Java面试题82:怎么把微信和业务平台进行绑定.mp4 │ Java面试题83:项目的分类和项目参与者.mp4 │ Java面试题84:项目流程和业务注意事项.mp4 │ 面试必问-...
明智地选择航空公司,请告知! 介绍 是一个Web应用程序,可用于从RITA(研究与创新技术和管理)网站获得的航空公司航班准时性能数据的快速且用户友好的查询。 数据每季度更新一次,可追溯到1987年10月。历史数据...