第1章大型互联网公司的基础架构——1.10 其他NoSQL数据库
这里我们简单介绍一下其他常见的NoSQL数据库及其适用的场景,其中部分数据库会在后续服务设计章节中正式使用时再做详细介绍。
1.10.1 文档数据库
文档数据库的典型代表是MongoDB和CouchDB。**文档数据库普遍采用JSON格式来存储数据,而不是采用僵硬的行和列结构,其好处是可以解决关系型数据库表结构(Schema)扩展不方便的问题,以及可以存储和读/写任何格式的数据。**文档数据库与键值存储系统很类似,只不过值存储的内容是文档信息。文档数据库具有很好的可扩展性。
文档数据库适用的场景如下。
- 数据量大,且数据增长很快的业务场景。
- 数据字段定义不明确,且字段在不断变化、无法统一的场景。比如商品参数信息存储,电子设备商品参数有内存大小、电池容量等,服装商品参数有尺码、面料等。
文档数据库不适用的场景如下。
- 需要支持事务,文档数据库无法保证在一个事务中修改多个文档的原子性。
- 需要支持复杂查询,例如join语句。
1.10.2 列式数据库
列式数据库的典型代表是BigTable、HBase等。关系型数据库按照行来存储数据,所以它也被称为“行式数据库”;而列式数据库按照列来存储数据,如图1-44所示的是一个学生信息数据的例子。

列式数据库将每一列的数据组织在一起,这样做有什么好处呢?假设现在要统计各专业的学生人数:
- 如果使用行式数据库,那么首先需要将所有行的数据读取到内存,然后对“专业”列进行GroupBy操作得到结果。虽然我们只关注“专业” 一列,但是其他列也参与了数据读取,磁盘I/O次数较多;
- 而如果使用列式数据库,那么只需要将“专业”列数 据读取到内存,磁盘I/O次数大大减少,提高了查询效率。
列式数据库有很高的存储空间利用率,对于列数据类型是有限枚举(比如性别、专业)的情况,列式数据库可以通过字典表将数据压缩为图1-45所示的形式。

从图1-45中可以看出,性别字典、专业字典分别使用了数字编号来代表原来的字符串,原始数据经过压缩后字符串变为数字,提高了存储空间利用率,且数据量越大,存储空间利用率越高。
列式数据库适用的场景如下。
- 有海量数据插入,但是数据修改极少的场景,比如用户行为收集。
- 数据分析场景,比如针对少数几列做离线数据统计工作。
列式数据库不适用的场景如下。
- 数据高频删除、修改的场景,即不适合直接服务于在线用户。
- 需要支持事务的场景。
1.10.3 全文搜索数据库
全文搜索数据库的典型代表是Elasticsearch。关系型数据库在应对全文搜索场景时,只能通过LIKE语句进行模糊查询,而LIKE语句会扫描全量数据,效率非常低下。全文搜索数据库的出现就是为了解决关系型数据库不支持高效全文搜索的问题,其基本原理是建立单词到文档的索引关系作为“倒排索引”。
如图1-46所示,倒排索引维护着每个关键词在哪些文档中出现过的文档列表。在进行全文搜索时,根据搜索关键词就可以直接获取到相关文档信息。文档列表既可以保存文档ID,也可以记录关键词在每个文档中出现的频率和位置。

倒排索引非常适合根据关键词查询文档内容,所以在各种搜索场景中得到了广泛应用。其典型的应用场景包括:
- 关键词搜索,如搜索引擎;
- 海量数据的复杂查询;
- 数据统计和数据聚合。
倒排索引不适用的场景包括:
- 高频更新数据的场景。在全文搜索数据库中,修改数据实际上是删除旧数据和创建新数据两步操作;
- 需要支持事务的场景。
1.10.4 图数据库
近几年图数据库较为火热,其主要的开源项目有Neo4j、Titan等。图数据库指的并不是存储图片的数据库,而是以“图”这种数据结构存储数据的数据库。
图由两个元素组成:
- 节点:表示一个实体(人、商品等事物)
- 关系:表示两个节点之间的关联关系
对于1.7.1节所举的例子:学生选课系统,如果用图数据库来存储,则会形成图1-47所示的存储结构。

从图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)扩展不方便的问题,以及可以存储和读/写任何格式的数据。
- 文档数据库与键值存储系统很类似,只不过值存储的内容是文档信息。
- 文档数据库具有很好的可扩展性。
文档数据库适用的场景?
- 数据量大,且数据增长很快的业务场景。
- 数据字段定义不明确,且字段在不断变化、无法统一的场景。比如商品参数信息存储,电子设备商品参数有内存大小、电池容量等,服装商品参数有尺码、面料等。
文档数据库不适用的场景?
- 需要支持事务,文档数据库无法保证在一个事务中修改多个文档的原子性。
- 需要支持复杂查询,例如join语句。
列式数据库适用的场景?
- 有海量数据插入,但是数据修改极少的场景,比如用户行为收集。
- 数据分析场景,比如针对少数几列做离线数据统计工作。
列式数据库不适用的场景?
- 数据高频删除、修改的场景,即不适合直接服务于在线用户。
- 需要支持事务的场景。
为什么会出现全文搜索数据库?
- 全文搜索数据库的出现就是为了解决关系型数据库不支持高效全文搜索的问题,其基本原理是建立单词到文档的索引关系作为“倒排索引”。
什么是倒排索引?
- 倒排索引建立了单词到文档的索引关系,维护着每个关键词在哪些文档中出现过的文档列表。
倒排索引的应用场景?
- 关键词搜索,如搜索引擎;
- 海量数据的复杂查询;
- 数据统计和数据聚合。
倒排索引不适用的场景包括:
- 高频更新数据的场景。在全文搜索数据库中,修改数据实际上是删除旧数据和创建新数据两步操作;
- 需要支持事务的场景。
什么是图数据库?
- 图数据库是指以“图”这种数据结构存储数据的数据库。
图数据库的适用场景?
- 它非常适合强调关系、需要复杂关系查询和分析的业务场景,比如社交网络、知识图谱等。
为什么会出现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 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
微信小程序:多菜单栏设计效果
一、实现效果 二、代码 wxml 编辑前端界面,步骤 菜单逻辑: 逐步取出数组中的项,首先取出顶部菜单项,然后选中后取出选中的底部数据(左侧菜单+右侧内容),然后点击左侧菜单取出选中的左侧菜单对应的右侧内容 ①这里我的数据是全部封装到一个数组对象的,首先我的循环…...
海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现,并可以在浏览器vue前端播放(附带源码)
1.首先说了一下为什么要用ISUP协议来取流 ISUP主要就是用来解决摄像头没有公网ip的情况,如果摄像头或者所在局域网的路由器有公网ip的话,其实采用rtsp直接取流是最方便也是性能最好的,但是项目的摄像头没有公网IP所以被迫使用ISUP,ISUP是海康…...
蓝桥杯之阶段考核
📖 Day 7:阶段考核 - 蓝桥杯官方模拟赛(限时 4 小时) 📖 一、如何高效完成模拟赛? 模拟赛是一种接近真实竞赛的训练方式。要高效完成模拟赛,需要掌握以下策略: 1. 赛前准备 ✅ 环…...
Python爬虫基础重要数据类型
重要数据类型 列表数据类型 在实际开发中,经常需要将一组(不只一个)数据存储起来,以便后边的代码使用。列表就是这样的一个数据结构。且列表是Python中最基本也是最常用的数据结构之一。什么是数据结构呢?通俗来讲&a…...
乐享数科:供应链金融—三个不同阶段的融资模式
供应链金融是与产业链紧密结合的融资模式,它主要体现在订单采购、存货保管、销售回款这三个不同的业务阶段,并针对这些阶段提供了相应的金融服务。以下是这三个阶段中主要的融资模式及其特点: 供应链金融融资模式主要分为以下几种࿱…...
【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分)【问题…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
