NoSQL 数据库有哪些典型应用?

前面的内容介绍了数据库读写分离和分库分表相关知识,都是针对关系型数据库的,即通常说的 RDBMS。除了关系型数据库,NoSQL 在项目开发中也有着越来越重要的作用,与此同时,NoSQL 相关的内容也是面试的常客。今天我们一起来看下 NoSQL 数据库有哪些应用。

对比关系型数据库

在介绍 NoSQL 数据库之前,先回顾下关系型数据库。还记得 SQL 语言的全称吗?Structured Query Language,也就是结构化查询语言,结构化查询对应的存储实现是关系型数据库,我们熟悉的 MySQL、Oracle 和 SQL Server,都是关系型数据库的代表。

关系型数据库通过关系模型来组织数据,在关系型数据库当中一个表就是一个模型,一个关系数据库可以包含多个表,不同数据表之间的联系反映了关系约束。

不知道你是否应用过 ER 图?在早期的软件工程中,数据表的创建都会通过 ER 图来定义,ER 图(Entity Relationship Diagram)称为实体-联系图,包括实体、属性和关系三个核心部分。

下面是在电商领域中,一个简化的会员、商品和订单的 ER 图:

24.png


简化版的会员、商品和订单 ER 图

ER图中的实体采用矩形表示,即数据模型中的数据对象,例如电商业务模型中的会员、商品、订单等,每个数据对象具有不同的属性,比如会员有账户名、电话、地址等,商品有商品名称、价格、库存等属性。不同的数据对象之间又对应不同的关系,比如会员购买商品、创建订单。

有了 ER 图等的辅助设计,关系型数据库的数据模型可以非常好的描述物理世界,比较方便地创建各种数据约束。

另外一方面,关系型数据库对事务支持较好,支持 SQL 规范中的各种复杂查询,比如 join、union 等操作。正是由于对 SQL 规范的支持,也使得关系型数据库对扩展不友好,比较难进行分布式下的集群部署。

NoSQL 数据库特性

NoSQL 数据库是在 SQL 的基础上发展的,对 NoSQL 的具体解释,你可以认为是 Not Only SQL,也可以认为是 Non-Relational SQL。

NoSQL 对应非关系型数据库,不同于传统的关系型数据库,如果说关系型数据库是武侠小说中的正统功夫,NoSQL 数据库就是野路子,少了很多约束,也就不拘一格、自成一派。那么对比关系型数据库,NoSQL 型数据库有哪些优点呢?

  • 良好的扩展性,容易通过集群部署

关系型数据库在进行扩展时,要考虑到如何分库分表、扩容等,各种实现方案都比较重,对业务侵入较大。NoSQL 数据库去掉了关系型数据库的关系特性,天生对集群友好,这样就非常容易扩展。

  • 读写性能高,支持大数据量

关系型数据库对一致性的要求较高,数据表的结构复杂,读写的性能要低于非关系型数据库。另外一方面,部分 NoSQL 数据库采用全内存实现,更适合一些高并发的访问场景。

  • 不限制表结构,灵活的数据模型

应用关系型数据库,需要通过 DML 语句创建表结构,数据表创建以后,增删字段需要重新修改表结构。如果使用 NoSQL,一般不需要事先为数据建立存储结构和字段,可以存储各种自定义的数据。

NoSQL 数据库有这么多优点,但是在项目开发中,关系型数据库和非关系型数据库不是对立的,而是相辅相成的。从性能的角度来讲,NoSQL 数据库的性能优于关系型数据库,从持久化角度,关系型数据库优于 NoSQL 数据库。

专栏最开始提到了 CAP 理论,从 CAP 的角度,NoSQL 数据库一般提供弱一致性的保证,实现最终一致性,也就是关系型数据库强调 CP 模型,而 NoSQL 关注的是 AP 模型,同时应用 NoSQL 和关系型数据库,可以满足高性能的基础上,同时保证数据可靠性。

NoSQL 数据库应用

非关系型数据库有很多类型,应用的侧重点也不同,可以从以下几个角度进行分类。

Key-Value 数据库

Key-Value 存储就是我们熟悉的 Map 结构,支持高性能的通过 Key 定位和存储。通常用来实现缓存等应用,典型的有 Redis 和 Memcached。

以 Redis 为例,作为应用最多的非关系型数据库之一,Redis 可以说是日常工作中的一把瑞士军刀。

从性能的角度,为了提高读写效率,Redis 在最开始的版本中一直使用单线程模型,避免上下文切换和线程竞争资源,并且采用了 IO 多路复用的技术,提升了性能,另外在最近的版本更新中,Redis也开始支持多线程处理,感兴趣的同学可以查看相关的资料了解。

从存储结构的角度,Redis 支持多种数据结构,得益于这些,Redis 有丰富的应用场景,并且针对不同的数据规模等,Redis 采取多种内存优化方式,尽量减少内存占用。比如,List 结构内部有压缩列表和双向链表两种实现,在数据规模较小时采用 ZipList 实现,特别是在新的版本更新中,又添加了 QuickList 的实现,减少内存的消耗。

从高可用的角度,作为一个内存数据库,Redis实现了AOF和RDB的数据持久化机制,另外,Redis支持了多种集群方式,包括主从同步,Sentinel和Redis Cluster等机制,提高了整体的数据安全和高可用保障。

文档型数据库

文档型数据库可以存储结构化的文档,比如 JSON 或者 XML,从这个角度上看,文档型数据库比较接近关系型数据库。但是对比关系型数据库,文档性数据库中不需要预先定义表结构,并且可以支持文档之间的嵌套,典型的比如 MongoDB,这一点和关系型数据库有很大的不同。

以 MongoDB 为例,采用了基于 JSON 扩展的 BSON 存储结构,可以进行自我描述,这种灵活的文档类型,特别适合应用在内容管理系统等业务中。MongoDB 还具备非常优秀的扩展能力,对分片等集群部署的支持非常全面,可以快速扩展集群规模。

列存储数据库

列式数据库被用来存储海量数据,比如 Cassandra、HBase 等,特点是大数据量下读写速度较快、可扩展性强,更容易进行分布式部署。

以 HBase 为例,HBase 支持海量数据的读写,特别是写入操作,可以支持 TB 级的数据量。列式数据库通常不支持事务和各种索引优化,比如 HBase 使用 LSM 树组织数据,对比 MySQL 的 B+ 树,在高并发写入时有更好的性能。

图形数据库

在一些特定的应用场景可以应用特殊的数据库,比如图形数据库。在学习数据结构时我们知道,社交网络中的用户关系可以使用图来存储,于是诞生了一些图形数据库,可以方便地操作图结构的相关算法,比如最短路径、关系查找等。

图形数据库在一般的工程开发中应用较少,感兴趣的同学可以去了解一下。

总结

本文分享了 NoSQL 数据库相关的知识点,包括关系型数据库和非关系型数据库的对比,分析了常见 NoSQL 数据库的分类和应用特性。

大多数场景下,NoSQL 数据库是配合关系型数据库一起使用的,这就涉及了不同存储之间的同步问题,比如缓存和数据库的同步等,针对这个问题,会在缓存模块展开介绍。现在你可以结合自己的项目实践,思考下应用过哪些非关系型数据库,以及使用了哪些对应特性,如何配合关系型数据库等,欢迎留言分享。

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

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

相关文章

计算机网络技术的应用探讨

一、计算机网络技术的概念与主要功能 计算机网络技术指的是将计算机与传输介质连接在 一起,并根据规定的网络协议进行数据通信,从而实现 数据资源共享的一种技术。计算机网络技术的主要功能 包括以下三点。第一,计算机网络技术具有通信功能&a…

如何进行软件测试和测试驱动开发(TDD)?

1. 软件测试概述 1.1 什么是软件测试? 软件测试是一种评估系统的过程,目的是发现潜在的错误或缺陷。通过对软件进行测试,开发者和测试人员可以确定软件是否符合预期的需求、功能是否正常运行,以及系统是否足够稳定和可靠。 1.2…

函数难题:排列

给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。 现在,请你按照字典序将所有的排列方法输出。 输入格式 共一行,包含一个整数 n。 输出格式 按字典序输出所有排列方案,每个方案占一行。 数据范围 …

【Linux】驱动

驱动 驱动程序过程 系统调用 用户空间 内核空间 添加驱动和调用驱动 驱动程序是如何调用设备硬件 驱动 在计算机领域,驱动(Driver)是一种软件,它充当硬件设备与操作系统之间的桥梁,允许它们进行通信和协同工作。驱动程…

[已解决】uniapp内置插件,editor富文本报错(附quill.min.js、image-resize.min.js文件)

在使用uni-app运行内置插件editor时,无法输入内容,控制台报错 原因:查看官网得知,需动态引入quill.min.js、image-resize.min.js文件 解决方法: 1.下载quill.min.js、image-resize.min.js到项目static/eidtor文件中 链…

云原生之深入解析Kubernetes Operator的最佳实践和最常见的问题分析

一、Kubernetes Operator 简介 Kubernetes Operator 是通过连接主 API 并 watch 时间的一组进程,一般会 watch 有限的资源类型。当相关 watch 的 event 触发的时候,operator 做出响应并执行具体的动作。这可能仅限于与主 API 交互,但通常会涉…

从零开始搭建Go语言开发环境

https://www.liwenzhou.com/posts/Go/install_go_dev/ “go 命令现在默认在模块感知模式下构建包,即使没有 go.mod 存在也是如此。 “您可以将 GO111MODULE 设置为 auto,仅当当前目录或任何父目录中存在 go.mod 文件时,才能启用模块感知模式…

Linux下FFmepg使用

1.命令行录一段wav,PCM数据 ffmpeg -f alsa -i hw:0,0 xxx.wav//录制 ffplay out.wav//播放ffmpeg -f alsa -i hw:0,0 -ar 16000 -channels 1 -f s16le 1.pcm ffplay -ar 16000 -channels 1 -f s16le 1.pcm -ar freq 设置音频采样率 -ac channels 设置通道 缺省为1 2.将pcm…

uniapp组件map地图组件使用

在uniapp中&#xff0c;可以使用uni-app官方提供的map组件来实现地图功能。下面是一个简单的使用示例&#xff1a; 在页面中引入map组件&#xff0c;在template中添加以下代码&#xff1a; <template><view><!-- map组件 --><map :longitude"longi…

03 动态渲染数据

概述 One of the most used terms and reactive elements used when constructing Vue components is data properties. These manifest themselves within the data() function of a Vue instance: 数据属性是构建 Vue 组件时最常用的术语和反应式元素之一。这些属性体现在 …

Kubernetes实战(十四)-k8s高可用集群扩容master节点

1 单master集群和多master节点集群方案 1.1 单Master集群 k8s 集群是由一组运行 k8s 的节点组成的&#xff0c;节点可以是物理机、虚拟机或者云服务器。k8s 集群中的节点分为两种角色&#xff1a;master 和 node。 master 节点&#xff1a;master 节点负责控制和管理整个集群…

PyTorch官网demo解读——第一个神经网络(1)

神经网络如此神奇&#xff0c;feel the magic 今天分享一下学习PyTorch官网demo的心得&#xff0c;原来实现一个神经网络可以如此简单/简洁/高效&#xff0c;同时也感慨PyTorch如此强大。 这个demo的目的是训练一个识别手写数字的模型&#xff01; 先上源码&#xff1a; fr…

华为云CodeArts Pipeline常见问答汇总

1.【Pipeline】CodeArts Pipeline流水线如何传递参数至CodeArts Build编译构建任务 答参考文档 https://support.huaweicloud.com/pipeline_faq/pipeline_faq_0004.html https://support.huaweicloud.com/usermanual-pipeline/pipeline_10_0005.html https://support.hu…

Composer 安装与使用

Composer 是 PHP 的一个依赖管理工具。我们可以在项目中声明所依赖的外部工具库&#xff0c;Composer 会帮你安装这些依赖的库文件&#xff0c;有了它&#xff0c;我们就可以很轻松的使用一个命令将其他人的优秀代码引用到我们的项目中来。 Composer 默认情况下不是全局安装&a…

vue3 element-plus 日期选择器 el-date-picker 汉化

vue3 项目中&#xff0c;element-plus 的日期选择器 el-date-picker 默认是英文版的&#xff0c;如下&#xff1a; 页面引入&#xff1a; //引入汉化语言包 import locale from "element-plus/lib/locale/lang/zh-cn" import { ElDatePicker, ElButton, ElConfigP…

西南科技大学数据库实验二(表数据插入、修改和删除)

一、实验目的 &#xff08;1&#xff09;学会用SQL语句对数据库进行插入、修改和删除数据操作 &#xff08;2&#xff09;掌握insert、update、delete命令实现对表数据插入、修改和删除等更新操作。 二、实验任务 创建数据库&#xff0c;并创建Employees表、Departments表和…

Python学习笔记第七十五天(OpenCV图像应用)

Python学习笔记第七十五天 OpenCV图像应用读取图片显示图像写入图像保存图像 后记 OpenCV图像应用 读取图片 使用OpenCV读取图片非常简单&#xff0c;可以使用cv2.imread()函数。该函数接受两个参数&#xff1a;图像路径和标志。标志指定了读取图像的方式&#xff0c;包括是否…

MySQL5.x和8.0

区别1. 性能&#xff1a;MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍 MySQL 8.0 在以下方面带来了更好的性能&#xff1a;读/写工作负载、IO 密集型工作负载、以及高竞争&#xff08;"hot spot"热点竞争问题&#xff09;工作负载2. NoSQL&#xff1a;MySQL 从 5.7 版本开…

微服务网关Gateway

springcloud官方提供的网关组件spring-cloud-starter-gateway,看pom.xml文件,引入了webflux做响应式编程,请求转发用到了netty的reactor模型,支持的请求数在1W~1.5W左右。hystrix停止维护后,官方推荐resilience4j做服务熔断,网关这里也能看到依赖。 对于网关提供的功能…

什么是CI/CD?如何在PHP项目中实施CI/CD?

CI/CD&#xff08;持续集成/持续交付或持续部署&#xff09;是一种软件开发和交付方法&#xff0c;它旨在通过自动化和持续集成来提高开发速度和交付质量。以下是CI/CD的基本概念和如何在PHP项目中实施它的一般步骤&#xff1a; 持续集成&#xff08;Continuous Integration -…