当前位置: 首页 > news >正文

第1章大型互联网公司的基础架构——1.10 其他NoSQL数据库

这里我们简单介绍一下其他常见的NoSQL数据库及其适用的场景,其中部分数据库会在后续服务设计章节中正式使用时再做详细介绍。

1.10.1 文档数据库

文档数据库的典型代表是MongoDB和CouchDB。**文档数据库普遍采用JSON格式来存储数据,而不是采用僵硬的行和列结构,其好处是可以解决关系型数据库表结构(Schema)扩展不方便的问题,以及可以存储和读/写任何格式的数据。**文档数据库与键值存储系统很类似,只不过值存储的内容是文档信息。文档数据库具有很好的可扩展性。

文档数据库适用的场景如下。

  1. 数据量大,且数据增长很快的业务场景。
  2. 数据字段定义不明确,且字段在不断变化、无法统一的场景。比如商品参数信息存储,电子设备商品参数有内存大小、电池容量等,服装商品参数有尺码、面料等。

文档数据库不适用的场景如下。

  1. 需要支持事务,文档数据库无法保证在一个事务中修改多个文档的原子性。
  2. 需要支持复杂查询,例如join语句。

1.10.2 列式数据库

列式数据库的典型代表是BigTable、HBase等。关系型数据库按照行来存储数据,所以它也被称为“行式数据库”;而列式数据库按照列来存储数据,如图1-44所示的是一个学生信息数据的例子。

image-20250217131423942

列式数据库将每一列的数据组织在一起,这样做有什么好处呢?假设现在要统计各专业的学生人数:

  1. 如果使用行式数据库,那么首先需要将所有行的数据读取到内存,然后对“专业”列进行GroupBy操作得到结果。虽然我们只关注“专业” 一列,但是其他列也参与了数据读取,磁盘I/O次数较多;
  2. 而如果使用列式数据库,那么只需要将“专业”列数 据读取到内存,磁盘I/O次数大大减少,提高了查询效率。

列式数据库有很高的存储空间利用率,对于列数据类型是有限枚举(比如性别、专业)的情况,列式数据库可以通过字典表将数据压缩为图1-45所示的形式。

image-20250217131632598

从图1-45中可以看出,性别字典、专业字典分别使用了数字编号来代表原来的字符串,原始数据经过压缩后字符串变为数字,提高了存储空间利用率,且数据量越大,存储空间利用率越高。

列式数据库适用的场景如下。

  1. 有海量数据插入,但是数据修改极少的场景,比如用户行为收集。
  2. 数据分析场景,比如针对少数几列做离线数据统计工作。

列式数据库不适用的场景如下。

  1. 数据高频删除、修改的场景,即不适合直接服务于在线用户。
  2. 需要支持事务的场景。

1.10.3 全文搜索数据库

全文搜索数据库的典型代表是Elasticsearch。关系型数据库在应对全文搜索场景时,只能通过LIKE语句进行模糊查询,而LIKE语句会扫描全量数据,效率非常低下。全文搜索数据库的出现就是为了解决关系型数据库不支持高效全文搜索的问题,其基本原理是建立单词到文档的索引关系作为“倒排索引”

如图1-46所示,倒排索引维护着每个关键词在哪些文档中出现过的文档列表。在进行全文搜索时,根据搜索关键词就可以直接获取到相关文档信息。文档列表既可以保存文档ID,也可以记录关键词在每个文档中出现的频率和位置。

image-20250217132040119

倒排索引非常适合根据关键词查询文档内容,所以在各种搜索场景中得到了广泛应用。其典型的应用场景包括:

  1. 关键词搜索,如搜索引擎;
  2. 海量数据的复杂查询;
  3. 数据统计和数据聚合。

倒排索引不适用的场景包括:

  1. 高频更新数据的场景。在全文搜索数据库中,修改数据实际上是删除旧数据和创建新数据两步操作;
  2. 需要支持事务的场景。

1.10.4 图数据库

近几年图数据库较为火热,其主要的开源项目有Neo4j、Titan等。图数据库指的并不是存储图片的数据库,而是以“图”这种数据结构存储数据的数据库

图由两个元素组成:

  • 节点:表示一个实体(人、商品等事物)
  • 关系:表示两个节点之间的关联关系

对于1.7.1节所举的例子:学生选课系统,如果用图数据库来存储,则会形成图1-47所示的存储结构。

image-20250217132516215

从图1-47中可以看出,图数据库可以很简单且自然地构建出直观的数据模型;同时,我们可以很容易查询任意一个节点与其他节点的关系,解决了关系型数据库不擅长处理实体关系的问题。关系在图数据库中占首要地位,它非常适合强调关系、需要复杂关系查询和分析的业务场景,比如社交网络、知识图谱等。

1.10.5 NewSQL数据库

上述几种NoSQL数据库,虽然分别解决了关系型数据库无法实现高效处理的一些问题,但是也几乎丧失了关系型数据库的强一致性、事务支持等特性。因此,结合关系型数据库及NoSQL数据库两者优点的数据库便产生了,即NewSQL数据库。目前其较为知名的项目包括Google Spanner、TiDB、CockroachDB等。

**NewSQL底层依然采用NoSQL存储数据。**更确切地说,NewSQL使用分布式键值存储系统存储数据,而且在此基础上进行了很多革新,例如:

  • 键值存储系统采用LSM Tree模型构建,可以大幅度提升写数据性能;
  • 放弃了NoSQL的主从复制模式,而是以更小粒度的数据分片作为高可用单位,主从分片之间通过Paxos或Raft等分布式共识算法进行数据复制;
  • 采用分布式事务实现键值存储系统的事务能力。

NewSQL既保留了NoSQL可扩展性强的优势,又在此基础上提供了类似于关系型数据库的事务能力。换言之,NewSQL的本质就是在传统关系型数据库上集成了NoSQL强大的可扩展性。NewSQL的思想很好,它作为数据库领域的后起之秀,正在进入越来越多的应用场景。但是目前NewSQL依然是小众产品,它在高并发、事务性上的表现还需要更多的考验,短期内NewSQL难以完全取代关系型数据库和NoSQL数据库。

总结

什么是文档数据库?

  • 文档数据库的典型代表是MongoDB和CouchDB。
  • 文档数据库普遍采用JSON格式来存储数据,而不是采用僵硬的行和列结构,其好处是可以解决关系型数据库表结构(Schema)扩展不方便的问题,以及可以存储和读/写任何格式的数据。
  • 文档数据库与键值存储系统很类似,只不过值存储的内容是文档信息。
  • 文档数据库具有很好的可扩展性。

文档数据库适用的场景?

  1. 数据量大,且数据增长很快的业务场景。
  2. 数据字段定义不明确,且字段在不断变化、无法统一的场景。比如商品参数信息存储,电子设备商品参数有内存大小、电池容量等,服装商品参数有尺码、面料等。

文档数据库不适用的场景?

  1. 需要支持事务,文档数据库无法保证在一个事务中修改多个文档的原子性。
  2. 需要支持复杂查询,例如join语句。

列式数据库适用的场景?

  1. 有海量数据插入,但是数据修改极少的场景,比如用户行为收集。
  2. 数据分析场景,比如针对少数几列做离线数据统计工作。

列式数据库不适用的场景?

  1. 数据高频删除、修改的场景,即不适合直接服务于在线用户。
  2. 需要支持事务的场景。

为什么会出现全文搜索数据库?

  • 全文搜索数据库的出现就是为了解决关系型数据库不支持高效全文搜索的问题,其基本原理是建立单词到文档的索引关系作为“倒排索引”。

什么是倒排索引?

  • 倒排索引建立了单词到文档的索引关系,维护着每个关键词在哪些文档中出现过的文档列表。

倒排索引的应用场景?

  1. 关键词搜索,如搜索引擎;
  2. 海量数据的复杂查询;
  3. 数据统计和数据聚合。

倒排索引不适用的场景包括:

  1. 高频更新数据的场景。在全文搜索数据库中,修改数据实际上是删除旧数据和创建新数据两步操作;
  2. 需要支持事务的场景。

什么是图数据库?

  • 图数据库是指以“图”这种数据结构存储数据的数据库。

图数据库的适用场景?

  • 它非常适合强调关系、需要复杂关系查询和分析的业务场景,比如社交网络、知识图谱等。

为什么会出现NewSQL数据库?

  • NoSQL数据库,虽然解决了关系型数据库无法实现高效处理的一些问题,但是也几乎丧失了关系型数据库的强一致性、事务支持等特性。
  • 因此,结合关系型数据库及NoSQL数据库两者优点的数据库便产生了。

什么是NewSQL数据库?

  • NewSQL底层依然采用NoSQL存储数据。更确切地说,NewSQL使用分布式键值存储系统存储数据。

NewSQL数据库有哪些革新?

  • 键值存储系统采用LSM Tree模型构建,可以大幅度提升写数据性能;
  • 放弃了NoSQL的主从复制模式,而是以更小粒度的数据分片作为高可用单位,主从分片之间通过Paxos或Raft等分布式共识算法进行数据复制;
  • 采用分布式事务实现键值存储系统的事务能力。

相关文章:

第1章大型互联网公司的基础架构——1.10 其他NoSQL数据库

这里我们简单介绍一下其他常见的NoSQL数据库及其适用的场景,其中部分数据库会在后续服务设计章节中正式使用时再做详细介绍。 1.10.1 文档数据库 文档数据库的典型代表是MongoDB和CouchDB。**文档数据库普遍采用JSON格式来存储数据,而不是采用僵硬的行…...

DeepSeek+Kimi生成高质量PPT

DeepSeek与Kimi生成PPT全流程解析 一、工具分工原理 DeepSeek核心作用:生成结构化PPT大纲(擅长逻辑构建与内容优化)Kimi核心作用:将文本转换为视觉化PPT(提供模板库与排版引擎) 二、操作步骤详解 1. 通…...

web网络安全:跨站脚本攻击(XSS)

跨站脚本攻击(XSS)概述 跨站脚本攻击(XSS,Cross-Site Scripting) 是一种常见的 Web 安全漏洞,攻击者通过向受信任的网站注入恶意脚本(通常是 JavaScript),诱使其他用户在…...

【Python爬虫(44)】分布式爬虫:筑牢安全防线,守护数据之旅

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取&#xff…...

微信小程序:多菜单栏设计效果

一、实现效果 二、代码 wxml 编辑前端界面,步骤 菜单逻辑: 逐步取出数组中的项,首先取出顶部菜单项,然后选中后取出选中的底部数据(左侧菜单+右侧内容),然后点击左侧菜单取出选中的左侧菜单对应的右侧内容 ①这里我的数据是全部封装到一个数组对象的,首先我的循环…...

海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现,并可以在浏览器vue前端播放(附带源码)

1.首先说了一下为什么要用ISUP协议来取流 ISUP主要就是用来解决摄像头没有公网ip的情况,如果摄像头或者所在局域网的路由器有公网ip的话,其实采用rtsp直接取流是最方便也是性能最好的,但是项目的摄像头没有公网IP所以被迫使用ISUP,ISUP是海康…...

蓝桥杯之阶段考核

📖 Day 7:阶段考核 - 蓝桥杯官方模拟赛(限时 4 小时) 📖 一、如何高效完成模拟赛? 模拟赛是一种接近真实竞赛的训练方式。要高效完成模拟赛,需要掌握以下策略: 1. 赛前准备 ✅ 环…...

Python爬虫基础重要数据类型

重要数据类型 列表数据类型 在实际开发中,经常需要将一组(不只一个)数据存储起来,以便后边的代码使用。列表就是这样的一个数据结构。且列表是Python中最基本也是最常用的数据结构之一。什么是数据结构呢?通俗来讲&a…...

乐享数科:供应链金融—三个不同阶段的融资模式

供应链金融是与产业链紧密结合的融资模式,它主要体现在订单采购、存货保管、销售回款这三个不同的业务阶段,并针对这些阶段提供了相应的金融服务。以下是这三个阶段中主要的融资模式及其特点: 供应链金融融资模式主要分为以下几种&#xff1…...

【AI】openEuler 22.03 LTS SP4安装 docker NVIDIA Container Toolkit

NVIDIA Container Toolkit 打开网址 Unsupported distribution or misconfigured repository settings | NVIDIA Container Toolkit 为方便离线安装,先下载过来 wget https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo mk…...

【2025全网首发B站教程】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测!

【2025全站首发】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测! 文章目录 1. 数据集准备1.1 标签格式转换1.2 数据集划分1.3 yaml配置文件创建 2. 训练验证 1. 数据集准备 示例数据集下载链接:P…...

设计模式教程:中介者模式(Mediator Pattern)

中介者模式是一种行为型设计模式,它用于减少对象之间的直接依赖关系。通过引入一个中介者对象,所有对象的交互都通过中介者进行,而不是直接相互通信。这种模式的主要目的是减少对象之间的耦合,提升系统的灵活性和可维护性。 1. 定…...

编写dockercompose脚本,管理redis,activemq,mysql5.7

编写dockercompose脚本,管理redis,activemq,mysql5.7,mysql的root密码设置Duke2007,redis密码设置duke0591 Docker Compose 多服务编排脚本(安全增强版) yaml 复制 services: # # MySQL 5.7 服务配置 #…...

【编程语言】委托与函数指针

委托与函数指针的相似之处: 指向方法:C# 的委托和 C 的函数指针都可以用来指向一个方法或函数。调用方法:它们都可以通过引用(委托或函数指针)来调用指向的方法。 委托与函数指针的主要区别: 类型安全&am…...

基于vue和微信小程序的校园自助打印系统(springboot论文源码调试讲解)

第3章 系统设计 3.1系统功能结构设计 本系统的结构分为管理员和用户、店长。本系统的功能结构图如下图3.1所示: 图3.1系统功能结构图 3.2数据库设计 本系统为小程序类的预约平台,所以对信息的安全和稳定要求非常高。为了解决本问题,采用前端…...

数字后端实现之Innovus中open net原因解析及解决方案

数字IC后端设计实现Innovus中我们经常会碰到如下的WARNING警告信息。这个log是在route或ECO Route阶段报的。这个WARNING必须要看,因为这里是报告当前设计存在open的net,即某些pin只有逻辑连接,而没有实际的物理连接。 这里正常工具应该报ERR…...

MATLAB基础学习相关知识

MATLAB安装参考:抖音-记录美好生活 MATLAB基础知识学习参考:【1小时Matlab速成教程-哔哩哔哩】 https://b23.tv/CnvHtO3 第1部分:变量定义和基本运算 生成矩阵: % 生成矩阵% 直接法% ,表示行 ;表示列 a [1,2,3;4,5,6;7,8,9];%…...

Mac系统下使用Docker快速部署MaxKB:打造本地知识库问答系统

随着大语言模型的广泛应用,知识库问答系统逐渐成为提升工作效率和个人学习的有力工具。MaxKB是一款基于LLM(Large Language Model)大语言模型的知识库问答系统,支持多模型对接、文档上传和自动爬取等功能。本文将详细介绍如何在Ma…...

RT-Thread+STM32L475VET6——icm20608传感器

文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行配置1.1 使用外部高速时钟,并修改时钟树1.2 打开I2C3,参数默认即可(I2C根据自己需求调整)1.3 打开串口1.4 生成工程 2. 添加icm20608软件包3. 使能传感器,打开动态链接库4.…...

【信息系统项目管理师-案例真题】2022下半年案例分析答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一(24分)【问题1】(6分)【问题2】(10分)【问题3】(8分)试题二(26分)【问题1】(8分)【问题2】(8分)【问题3】(4分)【问题4】(6分)试题三(25分)【问题1】(12分)【问题2】(7分)【问题…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

python/java环境配置

环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

OpenLayers 分屏对比(地图联动)

注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言: 类加载器 1. …...