【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

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


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

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2011-01-22 22:0128939

评论 1 条评论

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

大数据编程培训课程怎么选择

小谷哥

22年Java面试真题整理,一共343道,每一题都很经典,堪称秋招必备

Java编程日记

Java 编程 程序员 面试 架构师

解码微盟集团2022中报:SaaS收入5.81亿逆势增长,高质量增长路径更清晰

ToB行业头条

元宇宙里的下个社交时代

智捷云

元宇宙

开源一夏 | 原生js实现吃掉病毒,还森林一片祥和!

法医

开源

学习总结-网关 架构演进

C++后台开发

网络编程 API 网关 C/C++后台开发 C/C++开发

RabbitMQ面试29连问,看完还过不了面试,我给你一Jio

小柴说Java

Java 编程 程序员 面试 架构师

元老级的存储类型:块存储,性能很强!

wljslmz

8月月更 块存储

兆骑科创创业赛事活动服务平台,投融资服务对接,政策申报

兆骑科创凤阁

OceanBase发布“珊瑚计划”,让合作伙伴成为OceanBase成功的关键

OceanBase 数据库

RocketMQ面试33连问,答完面试官主动要给我提薪资待遇...

Java编程日记

Java 编程 程序员 面试 架构师

建木持续集成平台v2.5.3发布

Jianmu

DevOps 持续集成 CI/CD 持续交付 gitops

墙裂安利!用腾讯云AI语音合成打造自己的第一本有声书

牵着蜗牛去散步

腾讯云 腾讯 语音合成 技术实践 有声读物

华为被迫开源!从认知到落地SpringBoot企业级实战手册(完整版)

Java编程日记

Java 编程 程序员 面试 架构师

私有化部署的低代码平台 更安全的信息化解决方案

力软低代码开发平台

2022 OceanBase 年度发布会:发布四大策略,迈入4.0时代

OceanBase 数据库

Vuex与前端表格施展“组合拳”,实现大屏展示应用的交互增强

葡萄城技术团队

Vue 前端 表格 vuex

网易伏羲实验室入选信通院首批大模型优秀应用案例

网易伏羲

人工智能 网易伏羲

武汉java培训技术学习对学历的要求

小谷哥

【计算讲谈社】第九讲|“碳中和”时代下:计算的机会在哪里?

大咖说

计算 碳中和

哪家web前端培训班比较好

小谷哥

刘伟光:超大型金融机构国产数据库全面迁移成功实践

OceanBase 数据库

Go-Excelize API源码阅读(十四)——GetSheetFormatPr

Regan Yue

开源 源码刨析 Go 语言 8月日更 8月月更

大数据毕业设计

Geek_Q

科普达人丨一图看懂阿里云ECS

阿里云弹性计算

云计算 IaaS 弹性计算 ECS

提升LED显示屏散热效果的7种方式

Dylan

LED显示屏 led显示屏厂家

X-mask神秘面具NFT挖矿dapp系统开发逻辑详情

开发微hkkf5566

开源一夏 | 如何使用谷歌浏览器 Chrome 更好地调试

海拥(haiyong.site)

JavaScript chrome 开源 Google 8月月更

深圳web前端培训费用多少?

小谷哥

膜拜阿里!首次发布「10亿级并发系统设计文档」(内部绝密)

退休的汤姆

阿里 面经 Java工程师 秋招 并发系统设计

前端培训班排名口碑怎么样

小谷哥

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