使用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.source
      and flight_1.time < flight_2.time
      and 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, value1

Partition1, 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数据库又该怎样解决呢?

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【教程】Linux使用git自动备份和使用支持文件恢复的rm命令

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 背景介绍 首先非常不幸地告诉你&#xff1a;Linux 系统的标准 rm 命令不支持文件恢复功能。一旦使用 rm 删除了文件或目录&#xff0c;它们就会从文件系统中永久删除&#xff0c;除非你使用专门的文件恢复工具尝试…

如何在 Ubuntu 上安装 ONLYOFFICE 文档 8.0

通过使用社区版&#xff0c;您有能力在您自己的服务器上部署 ONLYOFFICE 文档&#xff0c;从而使在线编辑器与 ​​ONLYOFFICE 协作平台​​​或​​其他热门系统​​进行无缝集成。 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一款全面的在线办公工具&#xff0c;提供了文本文档…

ELAdmin 前端启动

开发工具 官方指导的是使用WebStorm&#xff0c;但是本人后端开发一枚&#xff0c;最终还是继续使用了 idea&#xff0c;主打一个能用就行。 idea正式版激活方式&#xff1a; 访问这个查找可用链接&#xff1a;https://3.jetbra.in/进入任意一个能用的里面&#xff0c;顶部提…

代码随想录算法训练营第四十五天(动态规划篇)|01背包

01背包理论基础 学习资料&#xff1a;代码随想录 (programmercarl.com) 相关链接&#xff1a;题目页面 (kamacoder.com) 背包题目分类 01背包定义 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次…

【Ftp客户端】FTPBox starter

Github&#xff1a; https://github.com/lihewei7/ftpbox-spring-boot-starterGitee&#xff1a; https://gitee.com/lihewei7/ftpbox-spring-boot-starter 文章目录 FTPBox是什么&#xff1f;Maven依赖使用APIuploaddownloadexistslistexecuteexecuteWithoutResult 配置单主机…

有责无权的PM如何管好项目?

一、项目经理的责任和权力分析 项目经理作为项目的责任主体&#xff0c;承担着确保项目顺利完成的重要责任。他们需要确保项目达到预期目标&#xff0c;控制项目进度、成本和质量&#xff0c;并保证项目团队的有效运作。然而&#xff0c;与责任相对应的权力却并不总是与之匹配…

Linux(三)--文件系统

Linux命令简介 [rootlocalhost ~]# 表示 Linux 系统的命令提示符。 []&#xff1a;这是提示符的分隔符号&#xff0c;没有特殊含义。 root&#xff1a;显示的是当前的登录用户&#xff0c;笔者现在使用的是 root 用户登录。 &#xff1a;分隔符号&#xff0c;没有特殊含义。 l…

安卓Termux+Hexo博客框架快速搭建本地网站并实现公网访问

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…

C语言在Visual Studio 2010环境下使用<regex.h>正则表达式函数库

在Visual Studio 2010环境下&#xff0c;如果C语言想要使用<regex.h>头文件进行正则表达式匹配&#xff0c;则需要pcre3.dll这个动态链接库&#xff0c;可以去网上下载。 下载的网址是&#xff1a;Pcre for Windowspcre {whatisit}https://gnuwin32.sourceforge.net/pac…

获取 Github XX项目软件最新版本方法(通过命令行)

场景&#xff1a; 如果我们项目中需要实现某个Github公共软件的最新版本更新 那么获取软件的最新的发布版本就是一个比较重要的工作了 对此&#xff0c;Github提供对外api不需要自己手动填写脚本了 解决方案&#xff1a; 替换黄色字体的项目地址&#xff0c;然后在cmd中执行…

第1章 认识Flask

学习目标 了解Flask框架&#xff0c;能够说出Flask框架的发展史以及特点 熟悉隔离Python环境的创建方式&#xff0c;能够独立在计算机上创建隔离的Python环境 掌握Flask的安装方式&#xff0c;能够独立在计算机上安装Flask框架 掌握PyCharm配置隔离环境的方式&#xff0c;能…

算法提升——LeetCode123场双周赛总结

周赛题目 三角形类型 II 给你一个下标从0开始长度为3的整数数组nums&#xff0c;需要用它们来构造三角形。 如果一个三角形的所有边长度相等&#xff0c;那么这个三角形称为equilateral。 如果一个三角形恰好有两条边长度相等&#xff0c;那么这个三角形称为isosceles。 如…

位运算:进制

4982. 进制 - AcWing题库 给定两个整数 a,b 请你计算&#xff0c;在 [a,b] 范围内有多少个整数满足其二进制表示恰好有一个 0。 不考虑前导 0。 例如&#xff0c;当 a5,b10 时&#xff0c;[5,10]范围内的所有整数及其二进制表示如下&#xff1a; 可以看出&#xff0c;只有 5 和…

鸿蒙开发系列教程(十四)--组件导航:Tabs 导航

Tabs 导航 Tabs组件的页面组成包含两个部分&#xff0c;分别是TabContent和TabBar。TabContent是内容页&#xff0c;TabBar是导航页签栏 每一个TabContent对应的内容需要有一个页签&#xff0c;可以通过TabContent的tabBar属性进行配置 设置多个内容时&#xff0c;需在Tabs…

消息队列使用的四种场景介绍

一、简介 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题。 实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。 使用较多的消息队列有ActiveMQ&#xff0c;RabbitMQ&#xff0c;ZeroMQ…

Paper - VQGAN: Taming Transformers for High-Resolution Image Synthesis 简读

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/136055085 VQGAN: Taming Transformers for High-Resolution Image Synthesis, CVPR 2021 VQGAN: 改良 Transformer 模型以实现高清图像合成 源码…

CentOS7搭建Hadoop集群

准备工作 1、准备三台虚拟机&#xff0c;参考&#xff1a;CentOS7集群环境搭建&#xff08;3台&#xff09;-CSDN博客 2、配置虚拟机之间免密登录&#xff0c;参考&#xff1a;CentOS7集群配置免密登录-CSDN博客 3、虚拟机分别安装jdk&#xff0c;参考&#xff1a;CentOS7集…

mysql入门到精通005-基础篇-约束

1、概述 1.1 概念 约束是作用于表中字段上的规则&#xff0c;用于限制储存在表中的数据。 1.2 目的 保证数据库中数据的正确性、有效性和完整性。 1.3 常见的约束分类 一旦谈到外键&#xff0c;则至少涉及2张表约束是作用于表中字段上的&#xff0c;可以在创建表/修改表的…

c++设计模式之代理模式

作用 代理模式主要用于&#xff0c;通过代理类&#xff0c;来控制实际对象的访问权限 案例 class VideoSite { public:virtual void freeVideo()0;virtual void vipVideo()0;virtual void trickVideo()0; };class FixBugVideoSite:public VideoSite { public:void freeVideo()…

uniCloud ---- schema2code

目录 schema2code有两种方式 label属性 component属性 group属性 应用 DB Schema里有大量的信息&#xff0c;其实有了这些信息&#xff0c;前端将无需自己开发表单维护界面&#xff0c;uniCloud可以自动生成新增、修改、列表、详情的前端页面&#xff0c;以及admin端的列…