写点什么

关系数据库还是 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:0129377

评论 1 条评论

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

征程 6M 部署 Omnidet 感知模型

地平线开发者

自动驾驶 算法工具链 地平线征程6

HarmonyOS DevEco Studio 小技巧 - 快速查阅文档的技巧:从新手到高手的效率跃迁

谢道韫

直播预告 | 7月10日晚19:30,解锁AI原生数据力量!

MatrixOrigin

时序数据库 Apache IoTDB V2.0.4 发布|新增用户自定义表函数及多种内置表函数功能

Apache IoTDB

Betterfox - 优化Firefox浏览体验的终极配置

qife

firefox privacy

ERP实施上线其实很简单,找对方法是关键!

积木链小链

数字化转型 ERP 智能制造

Bitcoin Core 开发与使用指南

qife

比特币 加密货币

【豆瓣8.7分】嵌入式开发神作,这本书没有大模型辅助,说人话讲干货

博文视点Broadview

数字时代,如何保护你的内容安全

腾讯云音视频

腾讯云 内容安全 媒体处理 DRM 水印

金属材料表面六种缺陷类型数据集 | 适用于YOLO等视觉检测模型(1800张图片已划分、已标注)

申公豹

YOLO数据集

2025 可信数据库大会,KaiwuDB 邀你来赴约!

KaiwuDB

解密Python代码如何生成"Among Us"字符:一段奇妙的Unicode探索之旅

qife

Python 编程技巧

观测云产品更新 | 付费计划与账单、事件中心、基础设施等

观测云

产品迭代

e签宝连续六年入选胡润全球独角兽榜单,是中国电子签名行业唯一品牌

科技汇

AI 系统架构的演进:LLM → RAG → AI Workflow → AI Agent

Baihai IDP

程序员 AI agent LLM rag

Excelize 荣获 2025 上海开源创新菁英奖

xuri

GitHub 微软 开源 Excel Excelize

Guitar Pro怎么添加小节 Guitar Pro怎么调整小节长度

阿拉灯神丁

吉他学习 Guitar Pro8 音乐软件 Mac乐谱制作软件 打谱软件

基于YOLOv8的FPS射击类游戏人物识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!

申公豹

yolov8

三星旗舰机型上新!现在就能用上的AI手机

新消费日报

6 月热搜精选

KaiwuDB

淘宝API文档:淘宝商品评论API接口

tbapi

淘宝商品评论接口 天猫商品评论接口 淘宝评论API 淘宝商品评论数据 天猫评论API

数智制造的下一个范式?低代码与云原生、AI的融合战略展望

电子尖叫食人鱼

低代码

轻松解密WebDecode:从网页源码中挖掘隐藏的Base64 flag

qife

CTF挑战 Base64解码

中烟创新参编的《跨媒体虚假新闻识别系统要求》标准正式发布

中烟创新

这几个 Vibe Coding 经验,真的建议学!

量贩潮汐·WholesaleTide

经验分享

iPaaS+MCP,赋能企业数智化转型,别让数据和AI“躺平”!

RestCloud

数据处理 数据集成 集成平台 ipaas MCP

一键启动:使用 start-local 脚本轻松管理 INFINI Console 与 Easysearch 本地环境

极限实验室

DevOps console Docker 镜像 easysearch

将 Go 应用从 x86 平台迁移至 Amazon Graviton:场景剖析与最佳实践

亚马逊云科技 (Amazon Web Services)

中烟创新:实力荣膺“国家高新技术企业”

中烟创新

焱融存储实力入围国家算力强基揭榜行动名单

焱融科技

人工智能 AI存储 焱融存储 算力基础设施

对话 AI 陪伴新宠 Tolan 创始人:拒绝「恋爱脑」,「非人」陪伴更受欢迎?丨 Voice Agent 学习笔记

声网

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