NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

NoSQL 与 RDBMS:何时使用,何时不使用

  • 2014-01-08
  • 本文字数:2496 字

    阅读完需:约 8 分钟

Naresh Kumar 是位软件工程师与热情的博主,对于编程与新事物拥有极大的兴趣,非常乐于与其他开发者和程序员分享技术上的研究成果。近日,Naresh撰文比较了NoSQL 与RDBMS,并详细介绍了他们各自的特点与适用的场景。

NoSQL 并不是关系型数据库管理系统,本文将会介绍 NoSQL 数据库与关系型数据库之间的差别,同时还会讨论在何种场景下应该使用 NoSQL,何种场景下不应该使用。由于 NoSQL 还是个相对较新的技术,因此它还面临着很多挑战。

时至今日,互联网上有数以亿计的用户。大数据与云计算已经成为很多主要的互联网应用都在使用或是准备使用的技术,这是因为互联网用户每天都在不断增长,数据也变得越来越复杂,而且有很多非结构化的数据存在,这是很难通过传统的关系型数据库管理系统来处理的。NoSQL 技术则能比较好地解决这个问题,它主要用于非结构化的大数据与云计算上。从这个角度来看,NoSQL 是一种全新的数据库思维方式。

为何要使用 NoSQL 数据库?

1.NoSQL 具有灵活的数据模型,可以处理非结构化 / 半结构化的大数据

现在,我们可以通过 Facebook、D&B 等第三方轻松获得与访问数据,如个人用户信息、地理位置数据、社交图谱、用户产生的内容、机器日志数据以及传感器生成的数据等。对这些数据的使用正在快速改变着通信、购物、广告、娱乐以及关系管理的特质。没有使用这些数据的应用很快就会被用户所遗忘。开发者希望使用非常灵活的数据库,能够轻松容纳新的数据类型,并且不会被第三方数据提供商内容结构的变化所累。很多新数据都是非结构化或是半结构化的,因此开发者还需要能够高效存储这种数据的数据库。但遗憾的是,关系型数据库所使用的定义严格、基于模式的方式是无法快速容纳新的数据类型的,对于非结构化或是半结构化的数据更是无能为力。NoSQL 提供的数据模型则能很好地满足这种需求。很多应用都会从这种非结构化数据模型中获益,比如说 CRM、ERP、BPM 等等,他们可以通过这种灵活性存储数据而无需修改表或是创建更多的列。这些数据库也非常适合于创建原型或是快速应用,因为这种灵活性使得新特性的开发变得非常容易。

2.NoSQL 很容易实现可伸缩性(向上扩展与水平扩展)

如果有很多用户在频繁且并发地使用你的应用,那么你就需要考虑可伸缩的数据库技术而非传统的 RDBMS 了。对于关系型技术来说,很多应用开发者会发现动态的可伸缩性是难以实现的,这时就应该考虑切换到 NoSQL 数据库上。对于云应用来说,关系型数据库一开始是普遍的选择。然而,在使用过程中却遇到了越来越多的问题,原因就在于他们是中心化的,向上扩展而非水平扩展的。这使得他们不适合于那些需要简单且动态可伸缩性的应用。NoSQL 数据库从一开始就是分布式、水平扩展的,因此非常适合于互联网应用分布式的特性。

在三层互联网架构的 Web/ 应用层上,多年来向上扩展已经成为默认的扩展方式了。随着应用使用人数的激增,我们需要添加更多的服务器,性能则是通过负载均衡来实现的,这时的代价与用户数量成线性比例关系。在 NoSQL 数据库之前,数据库层的默认扩展方式就是向上扩展。为了支持更多的并发用户以及存储更多的数据,你需要越来越好的服务器,更好的 CPU、更多的内存、更大的磁盘来维护所有表。然而,好的服务器意味着更加复杂、私有、并且也更加昂贵。这与 Web/ 应用层所使用的便宜的硬件形成了鲜明的对比。

3. 动态模式

关系型数据库需要在添加数据前先定义好模式。比如说,你需要存储客户的电话号码、姓名、地址、城市与州等信息,SQL 数据库需要提前知晓你要存的是什么。这对于敏捷开发模式来说是场灾难,因为每次完成新特性时,数据库的模式通常都需要改变。因此,如果在开发过程中想将客户喜欢的条目加到数据库中,那就得向表中添加这一列才行,然后要做的就是将整个数据库迁移到新的模式上。

4. 自动分片

由于是结构化的,关系型数据库通常会垂直扩展,单台服务器要持有整个数据库来确保可靠性与数据的持续可用性。这样做的代价就是非常昂贵、扩展受到限制,并且数据库基础设施会成为失败点。这个问题的解决方案就是水平扩展,添加服务器而不是为单台服务器增加更多的能力。NoSQL 数据库通常都支持自动分片,这意味着他们本质上就会自动在多台服务器上分发数据,应用甚至都不知道这些事情。数据与查询负载会自动在多台服务器上做到平衡,当某台服务器当机时,它能快速且透明地被替换掉。

5. 复制

大多数 NoSQL 数据库也支持自动复制,这意味着你可以获得高可用性与灾备恢复功能。从开发者的角度来看,存储环境本质上是虚拟化的。

NoSQL 数据库面临的挑战

1. 成熟度

RDBMS 系统由来已久。NoSQL 拥护者们会说 RDBMS 的高龄是其衰退的标志,不过对于大多数 CIO 来说,RDBMS 的成熟让人放心。对于大多数情况来说,RDBMS 系统是稳定且功能丰富的。相比较而言,大多数 NoSQL 数据库则还有很多特性有待实现。

2. 支持

企业需要的是安心,如果关键系统出现了故障,他们可以获得即时的支持。所有 RDBMS 厂商都在不遗余力地提供良好的企业支持。与之相反,大多数 NoSQL 系统都是开源项目,虽然每种数据库都有那么几家公司提供支持,不过这些公司大多都是小的初创公司,没有全球支持资源,也没有 Oracle、微软或是 IBM 那种令人放心的公信力。

3. 分析与商业智能

NoSQL 数据库在 Web 2.0 应用时代开始出现。因此,大多数特性都是面向这些应用的需要的。然而,应用中的数据对于业务来说是有价值的,这种价值远远超出了 Web 应用那种 CRUD。企业数据库中的业务信息可以帮助改进效率并提升竞争力,商业智能对于大中型企业来说是个非常关键的 IT 问题。

4. 管理

NoSQL 的设计目标是提供零管理的解决方案,不过当今的现实却离这个目标还相去甚远。现在的 NoSQL 需要很多技巧才能用好,并且需要不少人力、物力来维护。

5. 专业

全球有很多开发者,每个业务部门都会有熟悉 RDBMS 概念与编程的人。相反,几乎每个 NoSQL 开发者都处于学习模式。这种状况会随着时间的流逝而发生改观。但现在,找到一个有经验的 RDBMS 程序员或是管理员要比 NoSQL 专家容易多了。

结论

NoSQL 数据库正在成为数据库领域的重要力量。如果使用恰当,那么它会带来很多好处。然而,企业应该非常小心并注意到这些数据库的限制与问题。

公众号推荐:

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

2014-01-08 10:279795
用户头像

发布了 88 篇内容, 共 258.6 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

jdk 源码系列之StringBuilder、StringBuffer

sinsy

Java jdk 源码解析

手把手教你:将 ClickHouse 集群迁至云上

腾讯云大数据

大数据 Clickhouse

信息公交服务在滴滴的应用实践

滴滴技术

滴滴技术 人工只能 信息公交 路径优化

倒计时!Pulsar Summit Asia 2020 演讲征集

Apache Pulsar

开源 云原生 pulsar Apache Pulsar 消息中间件

线段树(Segment Tree)

zayfen

算法 线段树 segment tree

区块链带来的技术创新和变革

CECBC

区块链技术 经济

为什么推广ipv6以及网站ipv6改造基本步骤

MySQL从删库到跑路

Web IP 网络

华为云推出全自研数据库,GaussDB(openGauss)能否撑起一片天?

华为云开发者联盟

数据库 数据 gauss db

原创视频 | 架构漫谈—如何创造复杂而有序的软件系统【含课件下载】

编程道与术

Java 编程 架构 软件开发 软件架构

原创 | 使用JPA实现DDD持久化-JPA,Hibernate与Spring Data JPA

编程道与术

Java hibernate Spring C Data jpa

10多家公司的Java开发面试常见问题合集

Java架构师迁哥

架构师训练营第三周学习总结

邓昀垚

极客大学架构师训练营

架构师第一期作业(第三周)

Cheer

作业

原创 | 使用JPA实现DDD持久化-O/R阻抗失配(2/2)

编程道与术

Java hibernate DDD JDBC jpa

数字货币视域下的金融安全实现路径

CECBC

区块链 数字货币

一次注定失败的裸面

escray

ruby 程序员 面试 面经

打造一个全功能的浏览器

Daniel

原创 | 正确区分属性和字段

编程道与术

Java hibernate 编程 软件开发 jpa

你在开发过程中使用Git Rebase还是Git Merge?

华为云开发者联盟

git 华为 管理 代码

第二周-学习总结-框架设计原则

莫森

极客大学架构师训练营

原创 | 使用JPA实现DDD持久化-JPA vs MyBatis

编程道与术

Java hibernate 编程 mybatis jpa

一篇文章搞定 Nginx 反向代理与负载均衡

哈喽沃德先生

nginx 负载均衡 反向代理 服务器 正向代理与反向代理

看看别人是怎么面试蚂蚁金服的!社招Java面经分享

Java架构师迁哥

Java 阿里巴巴 面试 蚂蚁金服

为什么90%的“码农”做不了软件“架构师”?

Java架构师迁哥

Java 学习 架构师

揭开500亿“区块链”骗局

CECBC

法律 传销

致谢!华为全联接2020精彩回顾

华为云开发者联盟

华为 华为云 智能 hdc

架构师训练营第三周作业

文智

极客大学架构师训练营

StreamNative 宣布开源 MoP:Apache Pulsar 支持原生 MQTT 协议

Apache Pulsar

开源 云原生 mqtt Apache Pulsar 消息中间件

2020面试阿里字节跳动90%被问到的JVM面试题附答案

Java架构师迁哥

第二周-命题作业

莫森

极客大学架构师训练营

LeetCode题解:641. 设计循环双端队列,使用双向链表,JavaScript,详细注释

Lee Chen

大前端 LeetCode

NoSQL与RDBMS:何时使用,何时不使用_语言 & 开发_张龙_InfoQ精选文章