作为架构师的你,NoSQL如何选型

news2024/12/26 11:29:30

什么是 NoSQL?

NoSQL数据库是一种非关系型数据库管理系统它和我们传统的关系型数据库(如MySQL、Oracle)不一样。传统数据库要求你在存储数据之前,先定义好数据的结构(称为“schema”),而且数据通常是用表格的形式存储的。NoSQL数据库则不需要固定的结构,这使得它非常灵活易于扩展。

NoSQL数据库通常用于处理大量数据和需要快速响应的应用程序。例如:

  • 社交媒体:像微信、Facebook等平台每天会产生大量用户数据,NoSQL数据库能够高效地处理和存储这些数据。
  • 电商平台:阿里巴巴等电商网站每天处理数百万次交易数据,NoSQL能够帮助这些平台快速存取数据,确保用户体验流畅。

虽然NoSQL的字面意思是“不是SQL(Not Only SQL)”,但它的真正意义是“不仅仅是SQL”。实际上,NoSQL这个名字源于1998年Carl Strozz提出的概念,它已经成为这一类数据库的代名词。

NoSQL 数据库系统涵盖了广泛的数据库技术,可以存储结构化、半结构化、非结构化和多态数据。让我们通过一个图来了解NoSQL数据库:

为什么是 NoSQL?

NoSQL 数据库的概念是在谷歌、Facebook、亚马逊等这些互联网巨头流行起来的,它们的体量决定了它们有大量需要处理海量数据的场景。当使用 RDBMS 处理海量数据时,系统响应时间会变慢。

为了解决这个问题,一种方式可以通过升级现有硬件进行“纵向扩展(垂直扩展)”。但这种方法成本会非常高,并且单台机器的性能是有上限的。

解决此问题的另一种方法是,当负载或数据量增加时,将数据库负载分散到多个主机上。这种方法称为“横向扩展”。

NoSQL 数据库是非关系型的,它比关系型数据库具有更好的扩展性,因为它们是为Web应用程序设计的。

NoSQL 数据库简史

  • 1998 年 - Carlo Strozzi 使用 NoSQL 一词来描述他的轻量级开源关系数据库
  • 2000 年-图形数据库 Neo4j 推出
  • 2004 年- Google BigTable 推出
  • 2005 年-CouchDB 发布
  • 2007 年- 亚马逊发布Dynamo研究论文
  • 2008 年——Facebook 开源 Cassandra 项目
  • 2009 年——NoSQL 一词被重新提出

NoSQL 的特点

非关系型
  • NoSQL 数据库不遵循关系模型
  • 在 NoSQL 数据库中,你不会看到像传统数据库那样的固定列的表格。
  • NoSQL 数据库可以存储大型二进制对象(BLOB)或自包含的数据聚合,而不需要拆分成多个表。
  • 不需要对象关系映射和数据规范化
  • 没有复杂的功能,如查询语言、查询规划器、ACID

无模式

在传统的关系型数据库中,你需要提前定义好数据的结构(比如用户表需要包含“姓名”、“年龄”等列)。而在NoSQL数据库中,你不需要事先定义这些结构,可以根据需要随时添加新的数据类型或字段,灵活地存储各种不同的数据。

例如,一个电商网站,有些用户只提供了基本信息(比如姓名和电子邮件),而有些用户还提供了他们的购物历史。如果使用NoSQL数据库,这两种不同类型的数据可以存储在同一个数据库中,即使它们的结构完全不同。如果用关系型数据库(如MySQL)也不是不能存储,定义表结构时需要将所有可能的字段都定义好,即使某个字段可能只有极少数用户会有对应的值。

简单的 API

大多数NoSQL数据库通常会提供非常简单的接口来存储和查询数据。你可以使用像HTTP REST和JSON这样的文本协议,这使得它们易于与现代Web应用集成。

分布式架构

大多数NoSQL数据库可以轻松扩展到多个服务器(节点),形成一个分布式系统。这意味着它们可以处理大量的数据和高并发的请求。当某个节点出现故障时,系统提供自动扩展和故障转移能力,仍然可以继续工作,因为数据通常被复制到多个节点。这种分布式架构非常适合大规模的Web应用。

想象一下你在开发一个社交媒体平台,用户每天会上传大量的图片和视频。使用NoSQL数据库,你可以将数据分布存储在不同的服务器上,确保即使有一台服务器出问题,其他服务器还能继续提供服务。

NoSQL 数据库的类型

NoSQL 数据库主要分为四种类型:键值对数据库、列存储数据库、文档数据库和图数据库。每种类型都有其独特的属性和局限性。上述任何一种数据库都不能解决所有问题。我们应根据自己的业务场景选择最合适的数据库。

键值对数据库

这种数据库就像一个大字典,它以“键-值”的形式存储数据。键是唯一的,每个键都对应一个值,值可以是字符串、JSON、甚至是二进制文件(如图片)。例如,一个键值对可能包含一个键“Age”,对应的值是“42”。

键值对数据库的一个使用场景的电商网站的购物车,每个用户都有一个唯一的购物车ID(键)。这个ID对应的就是用户购物车中的所有商品(值)。比如,键“购物车123”对应的值可能是“{苹果,香蕉,橙子}”。

Redis、Dynamo、Riak 是一些常见的 NoSQL 键值存储数据库。它们都是基于亚马逊的 Dynamo 论文开发出的。

列存储数据库

这种数据库以列的方式存储数据,而不是传统数据库那样按行存储,基于 Google 的 BigTable 论文。每列都单独处理。单列数据库的值是连续存储的。

列存储数据库在SUM、COUNT、AVG、MIN等聚合查询上的性能很高,因为数据在列中是现成的,假设你有一个学生成绩单,其中包含“学生姓名”、“数学成绩”、“英语成绩”、“科学成绩”等列。如果你想快速计算全班的数学平均成绩,列存储数据库会非常高效,因为它能直接从“数学成绩”这一列中提取数据。

列存储存储NoSQL数据库广泛用于管理数据仓库、商业智能、CRM、图书馆卡片目录等。

HBase、Cassandra、HBase、Hypertable是一些常见的基于列的NoSQL数据库。

文档数据库

文档数据库也以“键-值”的形式存储数据,但与键值对数据库不同的是,这里的值是结构化文档(如JSON或XML),文档内部可以包含复杂的层次结构。存储的文档彼此相似,但不必完全相同,例如如果用文档数据库存储商品信息,有的商品是没有折扣这个属性,而有的商品没有积分属性,这完全是有可能的。

在左侧的关系数据库中,您可以看到有行和列,而右侧的文档数据库其结构与 JSON 类似。对于关系数据库,你需要知道有哪些列等。然而,对于文档数据库,你可以像JSON对象一样存储数据。你不需要定义列,这使其灵活。

文档类型主要用于 内容管理系统(CMS) 系统、博客平台、实时分析和电子商务应用程序。它不适用于需要针对不同聚合结构执行多项操作或查询的复杂事务。

Amazon SimpleDB、CouchDB、MongoDB、Riak、Lotus Notes 和 MongoDB 都是流行的基于文档的DBMS 系统。

图数据库

图数据库存储实体以及这些实体之间的关系。实体存储为节点,关系存储为边。边提供节点之间的关系。每个节点和边都有唯一标识符。

在图形数据库中,遍历连接或关系非常快。节点之间的关系不是在查询时计算的,而是在存储时被捕获到数据库作为关系持久化的,例如在社交网络中,每个用户都是一个节点,用户之间的“好友关系”就是边。如果你想知道“用户A”和“用户B”是如何连接的(比如通过共同的好友),图数据库能够非常快地找到答案,因为它已经存储了这些关系。

关系是图形数据库中的头等公民;图形数据库的大部分价值都来自关系。关系不仅具有类型、起始节点和终止节点,还可以具有自己的属性。例如,他们从什么时候开始成为朋友的,节点之间的距离是多少,或者节点之间共享哪些方面。

图形基础数据库主要用于社交网络、物流、空间数据。

Neo4J、Infinite Graph、OrientDB、FlockDB 是一些流行的基于图的数据库。

NoSQL 的优缺点

NoSQL 的优点
  • 可用作主要数据源或分析数据源: 如像Facebook这样的网站,可以把用户的帖子和评论存储在NoSQL数据库中,以便快速展示在用户的时间线上。

  • 大数据能力: Google的搜索引擎每天处理数十亿次搜索请求,NoSQL数据库帮助存储和管理这些数据。

  • 无单点故障: NoSQL 数据库通常是分布式的,数据被分散存储在多个服务器上。如果一台服务器出现故障,其他服务器可以继续工作,不会导致系统瘫痪。

  • 轻松复制: NoSQL 数据库通常能很容易地把数据复制到其他服务器,以提高数据的可用性和安全性。例如当一个用户在中国上传一张照片到社交媒体上,这张照片可以迅速复制到欧洲的服务器上,确保欧洲用户也能快速查看。

  • 无需单独的缓存层: NoSQL 数据库通常内置了缓存功能,这意味着你不需要再额外配置一层缓存来提高数据访问速度,例如像Redis这样的NoSQL数据库,本身性能就很高。

  • 它提供快速的性能和水平可扩展性: 一个视频流媒体网站可以通过增加更多的服务器来应对突然增长的观看需求。

  • 可以同等有效地处理结构化、半结构化和非结构化数据: NoSQL 数据库不仅能处理传统的结构化数据,还能处理半结构化和非结构化的数据,如文档、图像等,例如一个新闻网站可以在同一个数据库中存储文章、图片、视频和用户评论。

  • 面向对象编程,易于使用且灵活: NoSQL数据库更符合现代编程语言的风格,使用起来更自然和灵活,开发人员可以用NoSQL数据库轻松存储复杂的数据结构,而不必担心数据如何拆分成表格。

  • NoSQL 数据库不需要专用的高性能服务器: NoSQL 数据库可以运行在普通的服务器上,不需要专门的昂贵硬件,这对于小公司来说非常有用,它们可以使用普通的云服务器部署NoSQL数据库来处理他们的业务数据。

  • 支持主要开发语言和平台: NoSQL 数据库通常支持多种编程语言和开发平台,因此更容易集成到不同的系统中。

  • 比使用 RDBMS 更容易实现: NoSQL数据库的部署和使用比传统的关系型数据库要简单得多。一个新创企业可以在几小时内设置好一个NoSQL数据库来启动他们的应用程序,而不需要复杂的数据库配置。

  • 灵活的数据模型,适用于快速原型设计和开发: NoSQL 数据库可以轻松适应不断变化的需求,适合快速原型设计和开发,一个初创公司可以在早期快速迭代他们的产品,因为NoSQL数据库可以灵活地增加或修改数据结构。

NoSQL 的缺点
  • 提供最终一致性,而不是事务一致性: NoSQL 数据库提供的是“最终一致性”,即数据在一段时间后最终达到一致,而不是立即一致。如果你在全球的多个数据中心都有数据,在NoSQL数据库中,一个用户在中国的数据修改可能需要几秒钟才能在欧洲的数据中心同步。

  • 没有内置数据验证: NoSQL数据库通常不内置复杂的数据验证功能,开发者需要自己处理数据的正确性,例如在存储用户信息时,如果不额外编写验证逻辑,可能会存入错误或不完整的数据。

  • 没有标准化的接口: 同的NoSQL数据库有不同的接口和操作方式,缺乏统一的标准。如果你从一个NoSQL数据库迁移到另一个,可能需要重新编写很多代码来适应新的数据库接口。

  • 不能提供丰富的分析功能: 与关系型数据库相比。NoSQL 数据库不擅长复杂的数据分析,

  • 解决特定问题需要特定的数据库: 不同的NoSQL数据库擅长不同的任务,因此通常需要为不同的需求选择不同的数据库。例如:一个电商平台可能需要使用键值对数据库来管理用户会话,同时使用图数据库来管理推荐系统。

  • 不能处理复杂查询: NoSQL数据库不适合执行复杂的、多表关联查询,例如如果你需要查询“在过去一年中购买了某产品的所有用户的详细信息”,NoSQL数据库可能不如传统的SQL数据库高效。

现在相信你对NoSQL数据库的优缺点有了更清晰的理解。选择NoSQL还是传统的关系型数据库,取决于你的具体需求和使用场景。

最后需要说明的是,NoSQL的出现绝对不是为了取代关系型数据库,而是作为关系型数据库的补充,任何一个较有规模的应用,这两着都是共存的,一起保障系统稳定高效的运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一刷代码随想录(贪心5)

56. 合并区间 题意: 给出一个区间的集合,请合并所有重叠的区间。 示例 1: 输入: intervals [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. 示例 2: 输入: intervals [[1,4],[4…

用户画像系列——Spark任务调优实践

在画像标签的加工和写入hbase中,我们采用了spark来快速进行处理和写入。但是在实际线上运行的过程中,仍然遇到了不少问题,下面来总结下遇到的一些问题 1.数据倾斜问题 其实spark 数据倾斜思路和hive、mapreduce 数据倾斜思路处理类似&…

LED点阵屏(51单片机)

一、LED点阵屏介绍 1.点阵屏介绍及显示原理 2.开发板对应引脚 单片机工作是弱上拉,低电平强,高电平弱。 操作硬件电路是通过操作寄存器实现的 行:D0~D7 列:P0~P7 用P3口的三根线控制D0~D7,使能端OE,OE…

【Android】kotlin RecyclerView遍历json实现列表数据

需求 效果图如下 : 这个ui看起来简单, 其实要实现几个功能点 1. json数据的遍历 2. RecyclerView实现循环的列表 3. 每块元素里的元素点击 : 未选中的话, 首次点击显示"selected", 点击"selected"则进行下一步数据处理 4. 设置默认的选择的元素, 显示sel…

增加一个按钮,批量获取凭证号

create PROCEDURE Cux_Ar_ServiceLedger_Voucher_ProcOrgId Int ,result Int output AS BEGIN SET NOCOUNT ONDECLARE Date DATETIME IF OrgId 0 or OrgIdBEGIN RAISERROR(N获取当前组织ID失败!, 16, 1) RETURNEND SET Date GETDATE()BEGIN TRANSACTION BEGIN…

职场中这三大效应,读懂受用终身

01 霍桑效应 “霍桑效应”也称“宣泄效应”。 霍桑工厂是一家电器公司的分厂。为了提高员工的工作效率,工厂增设了许多娱乐设施,改善工作环境,提高各项福利,但奇怪的是,成效并不理想。 工厂为此又做了许多尝试&…

zabbix应用教程:基于Nginx页面响应的日志监控用例

作者 乐维社区(forum.lwops.cn)许远 背景:某公司基于 Nginx 服务器搭建的网站,需要监控页面响应耗时的数据,因此该公司搭建了zabbix开源监控系统,当监控到页面响应时间超过3000ms阈值时,就进行告…

C语言 | Leetcode C语言题解之第313题超级丑数

题目&#xff1a; 题解&#xff1a; int nthSuperUglyNumber(int n, int* primes, int primesSize) {long dp[n 1];int pointers[primesSize];for (int i 0; i < primesSize; i) {pointers[i] 0;}long nums[primesSize];for (int i 0; i < primesSize; i) {nums[i] …

Mosh|SQL教程第六弹

一、视图 1、创建视图CREATE VIEW viewname AS 这样就可以在左侧导航栏看到新增的view了&#xff0c;如果没有的话刷新一下就好了 可以把视图当表格使用 或者 注意&#xff1a;视图不存储数据&#xff0c;数据存储在表中 练习&#xff1a;创建一个视图&#xff0c;叫做客户结…

2023华为od机试C卷【掌握单词的个数】Python

2023华为od机试C卷【掌握单词的个数】 问题分析 输入内容&#xff1a; 具体的单词数量和单词列表。一个包含字母和 ? 的字符串&#xff0c;该字符串表示可以用来构词的字符。 目标&#xff1a; 计算哪些单词可以由给定字符以及 ?&#xff08;作为通配符&#xff09;构成。 …

政安晨:【Keras机器学习示例演绎】(五十七)—— 基于Transformer的推荐系统

目录 介绍 数据集 设置 准备数据 将电影评分数据转换为序列 定义元数据 创建用于训练和评估的 tf.data.Dataset 创建模型输入 输入特征编码 创建 BST 模型 开展培训和评估实验 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的…

Python 中的 “私有”(实现)类

在 Python 中&#xff0c;尽管没有严格意义上的私有类&#xff08;private class&#xff09;&#xff0c;但可以通过命名约定和语言特性来模拟实现类似的访问控制。Python 的私有类的概念通常是通过以下几种方式来实现&#xff1a; 1、问题背景 我正在编码一个由两部分组成的…

数值分析——分段低次插值

关键字&#xff1a;Matalb&#xff1b;曲线拟合&#xff1b;高次病态特性&#xff1b;分段低次插值 系列文章目录 数值分析——拉格朗日插值 数值分析——牛顿插值多项式 数值分析——埃尔米特&#xff08;Hermit&#xff09;插值 文章目录 系列文章目录前言一、理论推导1.高次…

Python面试宝典第25题:括号生成

题目 数字n代表生成括号的对数&#xff0c;请设计一个函数&#xff0c;用于能够生成所有可能的并且有效的括号组合。 备注&#xff1a;1 < n < 8。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()"…

泛化的最近点迭代法(Generalized-ICP)

Generalized-ICP算法是由斯坦福大学的Aleksandr V. Segal、Dirk Haehnel和Sebastian Thrun提出的&#xff0c;于2009年在Robotics science and system会议上发表。 GICP是一种ICP算法的变体&#xff0c;其原理与ICP算法相同&#xff0c;之所以称为泛化的ICP算法是因为大多数ICP…

MongoDB性能调优

文章目录 MongoDB性能调优MongoDB性能不佳原因影响MongoDB性能的因素MongoDB性能监控工具mongostatmongotopProfiler模块db.currentOp() MongoDB性能调优 MongoDB性能不佳原因 慢查询阻塞等待硬件资源不足 1,2通常是因为模型/索引设计不佳导致的 排查思路&#xff1a;按1-2…

再论国产数据库的选择

如何选择国产数据库? 上篇写得很水,本来不想继续写了! 毕竟写一篇很费心力,大家觉得好,就点下广告支持下吧! 因为今天看到类总的朋友圈,发个公号文章.里面讲个故事, 数据最前线 关注数据生态&#xff0c;讲述开源故事 13篇原创内容 公众号 某国产数据库救援现场惊魂8小时…

Golang | Leetcode Golang题解之第313题超级丑数

题目&#xff1a; 题解&#xff1a; func nthSuperUglyNumber(n int, primes []int) int {dp : make([]int, n1)m : len(primes)pointers : make([]int, m)nums : make([]int, m)for i : range nums {nums[i] 1}for i : 1; i < n; i {minNum : math.MaxInt64for j : range…

【大模型框架】【推理加速】KV CACHE

1. 思想 核心思想是空间换时间来进行加速 2. 基本原理 transformer是自回归生成模型&#xff0c;abc三个字符预测def 过程是: abc -> d d进行回归得到abc,回归讲究的是回去&#xff0c;如香港回归 abcd -> e 这里abc的运算中间值Q V可以保存下来作为Cache&#xf…

爬猫眼电ying

免责声明:本文仅做分享... 未优化,dp简单实现 from DrissionPage import ChromiumPage import time urlhttps://www.maoyan.com/films?showType2&offset60 pageChromiumPage()page.get(url) time.sleep(2) for i in range(1,20):# 爬取的页数for iu_list in page.eles(.…