HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

关系数据库还是 NoSQL 数据库

  • 2011-01-22
  • 本文字数:3076 字

    阅读完需:约 10 分钟

上一篇简单的说明了为什么要使用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 来作为我们的存储呢?这并不是一个很好回答的问题,影响我们选择的因素有很多,而选择也可能有多种,随着业务场景,需求的变更可能选择又会变化。我们常常需要根据如下情况考虑:

  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 架构的时候,你也会碰到上面的问题,所以这里没有阐述。

关于作者

孙立,目前在凤凰网负责底层组的研发工作。曾就职于搜狐和 ku6。多年互联网从业经验和程序开发,对分布式搜索引擎的开发,高并发,大数据量网站系统架构优化,高可用性,可伸缩性,分布式系统缓存, 数据库分表分库(sharding)等有丰富的经验,并且对运维监控和自动化运维控制有经验。开源项目 phplock,phpbuffer 的作者。近期开发了一个 NOSQL 数据库存储 INetDB, 是 NoSQL 数据库爱好者。他的新浪微博是: http://t.sina.com.cn/sunli1223


感谢张凯峰对本文的策划及审校。

2011-01-22 22:0129058

评论 1 条评论

发布
用户头像
居然搜到了大辉老师
2022-03-30 00:32
回复
没有更多了
发现更多内容

DolphinScheduler集成Arthas实现接口调用监控,提升调度任务可靠性

白鲸开源

工作流调度 Apache DolphinScheduler #开源

经济下行,当下企业如何破局?

禅道项目管理

需求管理 IPD 市场分析 IPD落地 IPD培训

DistilQwen2:通义千问大模型的知识蒸馏实践

阿里云大数据AI技术

人工智能 知识蒸馏 通义千问

程序员的幽默时刻:编程界的笑话集锦100

天津汇柏科技有限公司

程序员 软件开发

加锁失效,非锁之过,加之错也|京东零售供应链库存研发实践

京东零售技术

后端 加锁

第二届全国高校软件测试开发教育峰会在韩山师范学院隆重举办!

测试人

人工智能 软件测试 测试开发 高校

Digital Film Tools Rays for Mac中文破解版 ps光束滤镜

Rose

Mac 平台矢量图形编辑软件Boxy SVG for Mac

Mac相关知识分享

HyperWorks作业递交面板设置

智造软件

CAE Hypermesh hyperworks

漆包线自动称重系统

万界星空科技

mes 智能称重系统 电子称重系统 万界星空科技 漆包线工厂

Overlord(AE制作MG动画神器脚本) 中文版-mac&win

Rose

FilmUnlimited PowerGrades(柯达胶片模拟电影预设)

Rose

Midjourney-未来机甲

AIGC.TWang

未来世界 AI绘画 MidJourney

软件测试学习笔记丨Vue学习笔记-基本介绍

测试人

软件测试

低代码平台服务编排提升

鲸品堂

低代码 交付工具 企业号 2024年11月PK榜

基于IM场景下的Wasm初探:提升Web应用性能|得物技术

得物技术

rust web前端 Wasm

ps智能磨皮滤镜插件mac版Imagenomic Portraiture 4下载安装教程

Rose

淘宝详情API接口全解析:如何获取与应用

代码忍者

API 接口 pinduoduo API

e3d插件下载 - Video Copilot Element 3D for mac-AE三维模型插件

Rose

Plugin Alliance Brainworx bx_limiter True Peak(峰值限制器)

Rose

说说Java的类加载机制?究竟什么是双亲委派模型?

EquatorCoco

1400+自定义ps形状集合

Rose

中文汉化 AE/PR去朦胧除雾霾调色插件 ClearPlus

Rose

直接导入编辑MKV/MOV/FLV格式素材视频解码器AE/PR插件Influx

Rose

如何选择合适的TikTok网络节点

Ogcloud

代理IP tiktok运营 TikTok养号 tiktok节点 tiktok网络

昆仑万维重磅发布天工AI高级搜索功能,做最懂金融投资、科研学术的AI搜索

新消费日报

AutoSway(AE风吹自由摇曳摆动MG动画脚本) 中文汉化版

Rose

这AI队友哪智障了?这AI队友可太棒了!| 《易点新的》专访

网易伏羲

游戏AI

英伟达力推生命科学,背后分子动力学价值远被低估

新消费日报

【征程 6 工具链性能分析与优化-2】模型性能优化建议

地平线开发者

自动驾驶; #算法

征程 6E camera diag sample

地平线开发者

自动驾驶 算法

关系数据库还是NoSQL数据库_Java_孙立_InfoQ精选文章