使用No-SQL数据库支持连接查询用例的讨论

简介

在本文中,我们将简单介绍什么是No-SQL数据库。然后我们会讨论一种使用关系数据库比较容易实现的查询,即连接查询,怎么样使用No-SQL来实现。

什么是No-SQL数据库

与No-SQL数据库相对应的是传统的关系数据库(RDBMS)。我们还要从RDBMS开始介绍。RDBMS是传统的数据管理方法。数据存储在包含列和行的表中。每列代表了一个属性,每行代表数据的一个实例。每个表都要指定一个主键,即唯一标识表的标识符列。使用主键在表之间建立关系。可以使用它作为表的外键,在两个表的行之间建立关联。

No-SQL数据库的名称来自于not only SQL。基本包含了RDBMS之外的其它类型的数据库。可以参看这篇文档了解No-SQL数据库的具体介绍。No-SQL数据库包含如下几种类型:

  • Key-value数据库
  • Document数据库
  • Graph数据库
  • In-memory数据库
  • Search数据库

具体的每种No-SQL数据库的介绍可以参看文档的介绍。有必要说明,key-value数据库是使用最多的No-SQL数据库。所以我们一般说No-SQL数据库如果没有特别说明指的是key-value数据库。

Key-value数据库

Key-value数据库按照key-value pair的形式存储数据。也就是说如果我们想要访问一条数据,我们必须先知道它的key。比如我们有如下的key-value:

我们可以使用如下的API通过key获取value:

Value = load(key)

与RDBMS比较起来,key-value数据库有如下的有点:

  • No-SQL数据库的schema定义和修改非常灵活。因为保存和读取数据只要依赖key,对于value的定义可以非常灵活;
  • No-SQL数据库可以支持低latency的操作。因为和RDBMS比较起来,key-value的保存和读取非常简单,因此通常可以做到latency很低;
  • No-SQL数据库可以很好的支持数据库的SCALE。因为key-value的存储形式,可以很容易应用partition来根据需求scale out和scale in数据库。

正式因为以上有点,key-value数据库在现在的service中使用的越来越多。

问题

现在我们来考虑这样一个问题:我们有点到点的航班数据,也就是说某一次航班从一个城市在几点起飞到另一个城市。如果我们有了起飞城市和目标城市,想查询一个航班,无论使用RDBMS还是key-value都很容易实现。这里我们不做过多讨论。我们想解决的问题是如果没有直飞的航班,我们如何查询需要一次转机的航班。

使用RDBMS是很容易使用连接查询来解决这个问题的。比如我们定义如下的表 - flight:

id

source

target

Time

这里ID是主键。

我们可以使用如下的连接查询:

Select flight_1.id, flight_2.id
From flight as flight_1, flight as flight_2
where flight_1.target = flight_2.sourceand flight_1.time < flight_2.timeand flight_1.source = 'source city'and flight_2.target = 'target city';

那么如果我们使用key-value数据库如何解决这个问题呢?

解决方案

这里我们使用AWS的DynamoDB(即DDB)作为key-value数据库。DDB的key可以由两部分组成:partition key和sort key。具体介绍可以参看这个文档。简单来说,partition + sort是完整的key。我们可以使用这个key来找到唯一的记录。同时我们还可以使用partition来查询所有拥有相同partition key的所有记录。举例来说,如果我有如下两条记录:

Partition1, sort1, value1Partition1, sort2, value2

如果我使用如下API:

Load(partition1, sort1)

我将得到并且只得到第一条记录。

如果我使用如下API:

Query(partition1)

我同时将得到第一条和第二条记录。

首先我们还是先定义表。但是不同于RDBMS的表结构,我们将定义如下表 – source_flight:

source

id

target

Time

Source是partition key,id是sort key。Target和time是value。

我们还定义如下表 – target-flight:

Target

Id

Source

Time

Target是partition key,id是sort key。Source和time是value。

为了使这个例子更容易理解,我们定义一些数据如下:

Source-flight:

Source

Id

Target

Time

北京

1

上海

2024-03-01

北京

2

重庆

2024-03-02

上海

3

香港

2024-03-02

大连

4

香港

2024-03-03

Target-flight:

Target

Id

Source

Time

香港

3

上海

2024-03-02

香港

4

大连

2024-03-03

重庆

2

北京

2024-03-02

上海

1

北京

2024-03-01

现在我们要寻找从北京经过一次转机飞到香港的飞机。首先我们使用“北京”用query操作从source-flight表里得到从北京起飞的所有飞机 – 数据集1

ID:1, 2

其次我们使用“香港”用query操作从target-flight表里得到飞到香港的所有飞机 – 数据集2

ID:3, 4

如果我们使用集合里的“交”操作,得到数据集1里的“target”和数据集2里的“source”的交集。然后我们比较time来filter掉数据集2的time在数据集1的time之前的记录。

结论和扩展

我们可以看到对于连接查询这样的用例使用key-pair来解决使比较麻烦的。但是我们可以认为即便使看起来更麻烦的key-pair解决方案latency也很有可能低于RDBMS的解决方案。并且考虑到key-pair数据库在scale,performance,flexibility方面的优势,可以解决具体情况综合考虑哪种方案更好。

作为扩展,我们考虑一下如果我们要查询经过两次甚至更多次转机的方案时,使用key-pair数据库又该怎样解决呢?

这里的解决方法仅是我个人目前能想到的。如果大家有更好的解决方案,请大家进行分享。谢谢!

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

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

相关文章

JRT监听程序

本次设计避免以往设计缺陷&#xff0c;老的主要为了保持兼容性&#xff0c;在用的设计就不好调了。 首先&#xff0c;接口抽象时候就不在给参数放仪器ID和处理类了&#xff0c;直接放仪器配置实体&#xff0c;接口实现想用什么属性就用什么属性&#xff0c;避免老方式要扩参数时…

java的excel列行合并模版

1.效果 2.模版 <tableborder"1"cellpadding"0"cellspacing"0"class"tablebor"id"TABLE"><tr align"center" class"bg217"><td style"background-color: #008000; color: #ffffff;p…

archlinux 使用 electron-ssr 代理 socks5

提前下载好 pacman 包 https://github.com/shadowsocksrr/electron-ssr/releases/download/v0.2.7/electron-ssr-0.2.7.pacman 首先要有 yay 和 aur 源&#xff0c;这个可以参考我之前的博客 虚拟机内使用 archinstall 安装 arch linux 2024.01.01 安装依赖 yay 安装的&#…

WebGL+Three.js入门与实战——绘制水平移动的点、通过鼠标控制绘制(点击绘制、移动绘制、模拟画笔)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

JVM 性能调优 - 常用的垃圾回收器(6)

垃圾收集器 在 JVM(Java虚拟机)中,垃圾收集器(Garbage Collector)是负责自动管理内存的组件。它的主要任务是在程序运行过程中,自动回收不再使用的对象所占用的内存空间,以便为新的对象提供足够的内存。 JVM中的垃圾收集器使用不同的算法和策略来实现垃圾收集过程,以…

第4章——深度学习入门(鱼书)

第4章 神经网络的学习 本章的主题是神经网络的学习。这里所说的“学习”是指从训练数据中自动获取最优权重参数的过程。本章中&#xff0c;为了使神经网络能进行学习&#xff0c;将导入损失函数这一指标。而学习的目的就是以该损失函数为基准&#xff0c;找出能使它的值达到最…

一些常见的电源方案

开关电源&#xff1a; RM C 板&#xff1a;&#xff08;24V电压&#xff0c;10A电流&#xff09; SMBJ30CA&#xff1a;静电和浪涌保护(TVS/ESD) 一般使用NMOS管&#xff0c;因为PMOS管导通电阻与NMOS管比较会较大 模电非基础01——从一种常见的防反接&#xff0c;上电缓启…

Mysql大表添加字段失败解决方案

背景 最近遇到一个问题&#xff0c;需要在user用户表千万级别数据中添加两个字段&#xff0c;发现老是加不上去&#xff0c;一直卡死。表数据量不仅大&#xff0c;而且是一个热点表&#xff0c;访问频率特别高&#xff0c;而且该表的访问是在一个大事务中。加字段的时候一直在…

挑战杯 python 爬虫与协同过滤的新闻推荐系统

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python 爬虫与协同过滤的新闻推荐系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&…

【人工智能】神奇的Embedding:文本变向量,大语言模型智慧密码解析(10)

什么是嵌入&#xff1f; OpenAI 的文本嵌入衡量文本字符串的相关性。嵌入通常用于&#xff1a; Search 搜索&#xff08;结果按与查询字符串的相关性排序&#xff09;Clustering 聚类&#xff08;文本字符串按相似性分组&#xff09;Recommendations 推荐&#xff08;推荐具有…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之RichText组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之RichText组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、RichText组件 鸿蒙&#xff08;HarmonyOS&#xff09;富文本组件&#xff0c;…

【学习心得】Python好库推荐——tqdm

在很多时候&#xff0c;你都需要一个进度条来告知当前程序的运行状况和进展。tqdm 是一个在Python中广泛使用的命令行进度条工具库&#xff01;下面是这个库的主页&#xff1a;https://tqdm.github.io/ 一、快速入门 &#xff08;1&#xff09;for循环中 代码&#xff1a; …

句子嵌入: 交叉编码和重排序

这个系列目的是揭开嵌入的神秘面纱&#xff0c;并展示如何在你的项目中使用它们。第一篇博客介绍了如何使用和扩展开源嵌入模型&#xff0c;选择现有的模型&#xff0c;当前的评价方法&#xff0c;以及生态系统的发展状态。第二篇博客将会更一步深入嵌入并解释双向编码和交叉编…

C语言的起源

1940年代&#xff0c;最早的开始&#xff0c;编程语言是机器语言&#xff0c;用0/1表示的、计算机能直接识别和执行的一种机器指令的集合。最早的编程方式&#xff0c;就是给纸带打孔或者卡片机打孔。机器语言直接与硬件沟通&#xff0c;极具针对性&#xff0c;但是非常难于理解…

IP地址如何保护网络安全

面对网络攻击时&#xff0c;仅依靠常态化的网络安全防御系统已捉襟见肘&#xff0c;如联合使用IP地址数据可以形成多元化的安全解决方案&#xff0c;全面监控网络活动&#xff0c;发现潜在威胁&#xff0c;制定有针对性的应对措施。 网络攻击追踪 当网站或应用遭受DDoS等网络攻…

基于YOLOv8的暗光低光环境下(ExDark数据集)检测,加入多种优化方式---DCNv4结合SPPF ,助力自动驾驶(一)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了暗光低光数据集检测整个过程&#xff0c;从数据集到训练模型到结果可视化分析&#xff0c;以及如何优化提升检测性能。 &#x1f4a1;&#x1f4a1;&#x1f4a1;加入 DCNv4结合SPPF mAP0.5由原始的0.682提升至…

在 VMware 虚拟机上安装 CentOS系统 完整(全图文)教程

一、前期准备&#xff1a; 1.安装VMware 虚拟机软件&#xff08;不在讲解&#xff0c;可自行去下载安装&#xff09;。官网&#xff1a;https://customerconnect.vmware.com/cn/downloads/details?downloadGroupWKST-PLAYER-1750&productId1377&rPId111471 2.下载iso…

【AWS】step-functions服务编排

文章目录 step-functionsState machine typeStandard workflowsExpress workflows design skillsError handlingsaga Transaction processing控制分布式系统中的并发性 收费 作为AWS Serverless无服务器的一个重要一环 使用step-functions方法将 AWS 服务链接在一起 step-funct…

用python编写爬虫,爬取二手车信息+实验报告

题目 报告要求 工程报告链接放在这里 https://download.csdn.net/download/Samature/88805518使用 1.安装jupyter notebook 2.用jupyter notebook打开工程里的ipynb文件&#xff0c;再run all就行 注意事项 可能遇到的bug 暂无&#xff0c;有的话私信我

如何决定K8S Pod的剔除优先级

在Kubernetes&#xff08;k8s&#xff09;中&#xff0c;当节点资源面临压力时&#xff0c;如何决定Pod的优先级是一个关键问题。在Kubernetes 1.8版本之后&#xff0c;引入了基于Pod优先级的调度策略&#xff0c;即Pod Priority Preemption。这种策略允许在资源不足的情况下&a…