附加共享数据库( ATTACH DATABASE)的使用场景

附加共享数据库(使用 ATTACH DATABASE)的功能非常实用,通常会在以下几种场景下需要用到:


1. 跨数据库查询和分析

场景:
你的公司有两个独立的数据库:

  • 一个存储了学生信息 (school.db)
  • 一个存储了员工信息 (company.db)

你需要找出同时存在两个数据库中的人,比如既是学生又是员工的人。

解决方式:
通过附加共享数据库,你可以在同一个 SQLite 实例中跨两个数据库执行查询:

-- 打开主数据库
sqlite3 school.db-- 附加共享数据库
ATTACH DATABASE 'company.db' AS shared;-- 查询跨数据库的信息
SELECT s.name
FROM main.students s
JOIN shared.employees e
ON s.name = e.name;

意义:

  • 不需要额外导出、转换或合并数据,可以直接跨数据库操作。
  • 提高了多数据源查询和分析的效率。

2. 数据迁移

场景:
你需要将旧系统的数据迁移到新系统,比如:

  • old_system.db 存储了旧系统中的订单数据。
  • new_system.db 是新系统的空白数据库。

解决方式:
可以通过附加共享数据库来实现数据迁移:

-- 打开新系统数据库
sqlite3 new_system.db-- 附加旧系统数据库
ATTACH DATABASE 'old_system.db' AS old;-- 将旧系统数据插入到新系统中
INSERT INTO main.orders (id, customer, total)
SELECT id, customer, total
FROM old.orders;

意义:

  • 无需外部工具即可完成迁移。
  • 保证了迁移过程的方便性和一致性。

3. 合并数据

场景:
你有多个部门的独立数据库,每个数据库存储了一部分数据,比如:

  • department1.db 中存储了部门 1 的数据。
  • department2.db 中存储了部门 2 的数据。

你需要将所有部门的数据合并到一个总表中。

解决方式:

-- 打开总数据库
sqlite3 all_departments.db-- 附加各部门的数据库
ATTACH DATABASE 'department1.db' AS dep1;
ATTACH DATABASE 'department2.db' AS dep2;-- 合并数据到总数据库
INSERT INTO main.employees (id, name, department)
SELECT id, name, 'Department 1'
FROM dep1.employees;INSERT INTO main.employees (id, name, department)
SELECT id, name, 'Department 2'
FROM dep2.employees;

意义:

  • 快速整合分散在多个数据库中的数据。
  • 保证合并过程的一致性和准确性。

4. 只读共享数据

场景:
你的团队中有一个共享数据库 shared_data.db,存储了所有人的公共参考数据,比如邮政编码表、国家列表等。
而你的项目数据库 project.db 中存储了自己的业务数据。

解决方式:
通过附加共享数据库,你可以访问这些参考数据,而无需将它复制到项目数据库中:

-- 打开项目数据库
sqlite3 project.db-- 附加共享数据库
ATTACH DATABASE 'shared_data.db' AS shared;-- 查询共享数据中的国家列表
SELECT * FROM shared.countries;

意义:

  • 避免重复存储相同的数据,节省存储空间。
  • 确保共享数据的统一性和实时性。

5. 数据库分片管理

场景:
一个数据库因为数据量过大,被拆分为多个小数据库,每个小数据库管理一部分数据。
比如:

  • users_part1.db:存储用户 ID 从 1 到 10,000。
  • users_part2.db:存储用户 ID 从 10,001 到 20,000。

你需要对所有用户数据进行统计分析。

解决方式:
通过附加多个共享数据库,轻松进行跨分片查询:

-- 打开主数据库
sqlite3 users_analysis.db-- 附加多个分片数据库
ATTACH DATABASE 'users_part1.db' AS part1;
ATTACH DATABASE 'users_part2.db' AS part2;-- 统计所有用户的总数
SELECT COUNT(*) AS total_users
FROM part1.users
UNION ALL
SELECT COUNT(*)
FROM part2.users;

意义:

  • 让大规模数据的管理和操作更加灵活。
  • 支持分片存储的数据库结构。

总结

共享数据库适用于以下场景:

  1. 跨数据库查询和分析(比如学生与员工的对比)。
  2. 数据迁移(从旧系统迁移到新系统)。
  3. 数据合并(将多个部门的独立数据库合并为一个)。
  4. 只读共享数据(使用公共参考数据)。
  5. 数据库分片管理(对大数据进行分片存储和查询)。

通过附加其他架构(共享数据库),SQLite 提供了非常强大的多数据库协作能力,帮助用户高效管理和操作多个数据源!


这里用数据库分片管理举例说明:
你提供的 SQL 示例展示了如何使用 SQLite 的 ATTACH DATABASE 命令附加多个分片数据库,并在这些数据库中进行查询操作。以下是对代码的详细解读:


代码详解

  1. 打开主数据库

    sqlite3 users_analysis.db
    
    • 启动 SQLite 并打开一个主数据库 users_analysis.db
    • 主数据库可以用于存储最终的统计结果或执行查询的入口。
  2. 附加分片数据库

    ATTACH DATABASE 'users_part1.db' AS part1;
    ATTACH DATABASE 'users_part2.db' AS part2;
    
    • ATTACH DATABASE 用于加载额外的数据库文件(即分片数据库)。
    • AS part1AS part2 为附加数据库指定别名,后续查询中可以通过别名访问对应数据库中的表。
  3. 统计用户总数

    SELECT COUNT(*) AS total_users
    FROM part1.users
    UNION ALL
    SELECT COUNT(*)
    FROM part2.users;
    
    • COUNT(*):统计每个数据库中 users 表的用户总数。
    • UNION ALL:将两个查询结果合并在一起。
      • 如果使用 UNION(无 ALL),则会去除重复的结果,但在统计用户数量时通常需要保留重复。
  4. 结果解读
    查询结果将返回两行数据,每行分别对应 users_part1.dbusers_part2.db 中的用户数量。


改进:统计所有用户总和

如果你需要直接统计所有分片的用户总数,可以使用 SUM 函数:

SELECT SUM(user_count) AS total_users
FROM (SELECT COUNT(*) AS user_count FROM part1.usersUNION ALLSELECT COUNT(*) AS user_count FROM part2.users
);
改进后的效果:
  • 内层查询统计每个分片的用户数。
  • 外层通过 SUM 聚合内层查询的结果,得出所有用户的总数。

场景分析

这种方式适合**分片数据库(Sharded Database)**的应用场景:

  1. 分片存储: 数据库被拆分成多个文件,每个文件存储不同的子集数据,例如按照用户 ID、地理位置等划分。
  2. 查询效率: 将不同的分片附加到同一会话中,便于集中查询和分析。
  3. 大数据场景: 当单个数据库文件过大时,分片存储可以降低单个数据库的负担。

示例运行结果

假设分片数据库中的用户表如下:

part1.users
idname
1Alice
2Bob
part2.users
idname
3Charlie
4David
5Emma
执行结果:

查询 1:原代码(分开统计)

total_users
-----------
2
3

查询 2:改进代码(总和统计)

total_users
-----------
5

通过这种方式,可以轻松整合和分析多个分片数据库的数据。

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

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

相关文章

阿里云ios镜像源

阿里云镜像源:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 下载centos7

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(二)

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《…

用vscode+ollama自定义Cursor AI编辑的效果

在vscode上搜索Continue 添加大语言模型 选择对应的本地模型版本 效果

使用宝塔面板,安装 Nginx、MySQL 和 Node.js

使用ssh远程链接服务器 在完成使用ssh远程链接服务器后 可使用宝塔面板,安装 Nginx、MySQL 和 Node.js 宝塔网站 一、远程链接服务器 二、根据服务器系统安装宝塔 wget -O install.sh https://download.bt.cn/install/install_lts.sh && sudo bash inst…

Android车机DIY开发之软件篇(八)单独编译

Android车机DIY开发之软件篇(八)单独编译 1.CarLauncher单独编译 CarLauncher源码位于 packages/apps/Car/Launcher 用Eclipse ADT 谷歌定制版编译而成,.mk .bp编译 Android13目录如下: alientekalientek:~/packages/apps/Car$ ls Calendar …

SpringCloud项目搭建快速入门

SpringCloud项目搭建 注意:本项目采用JDK17,且已上传至Gitee,可自行下载 父工程创建方式一 Step1: 创建一个Maven聚合工程ScDemo 创建完成后删除除pom.xml文件外的所有文件及目录 Step2: 设置Mven为本地Maven 博主已进…

RabbitMQ 进阶

文章目录 一、发送者的可靠性1.1 生产者重试机制:1.2 生产者确认机制:1.2.1 开启生产者确认:1.2.2 定义 ReturnCallback:1.2.3 定义 ConfirmCallback: 二、MQ 的可靠性2.1 数据持久化:2.1.1 交换机持久化&a…

L4-Prompt-Delta

Paper List PromptPapers:https://github.com/thunlp/PromptPapersDeltaPapers: https://github.com/thunlp/DeltaPapers Programming Toolkit OpemPrompt: https://github.com/thunlp/OpenPromptOpenDelta: https://github.com/thunlp/OpenDelta 一、传统微调方法&#xff1…

【深度学习入门_基础篇】概率论

开坑本部分主要为基础知识复习,新开坑中,学习记录自用。 学习目标: 随机事件与概率、随机变量及其分布、多维随机变量及其分布、大数定律与中心极限定理。 强烈推荐此视频: 概率论_麻省理工公开课 废话不多说,直接…

Vision Transformer (ViT)原理

Vision Transformer (ViT)原理 flyfish Transformer缺乏卷积神经网络(CNNs)的归纳偏差(inductive biases),比如平移不变性和局部受限的感受野。不变性意味着即使实体entity(即对象)的外观或位…

如何让QPS提升20倍

一、什么是QPS QPS,全称Queries Per Second,即每秒查询率,是用于衡量信息检索系统(例如搜索引擎或数据库)或请求-响应系统(如Web服务器)每秒能够处理的请求数或查询次数的一个性能指标。以下是…

Domain Adaptation(李宏毅)机器学习 2023 Spring HW11 (Boss Baseline)

1. 领域适配简介 领域适配是一种迁移学习方法,适用于源领域和目标领域数据分布不同但学习任务相同的情况。具体而言,我们在源领域(通常有大量标注数据)训练一个模型,并希望将其应用于目标领域(通常只有少量或没有标注数据)。然而,由于这两个领域的数据分布不同,模型在…

SQL从入门到实战-1

目录 学前须知 sqlzoo数据介绍 world nobel covid ge game、goal、eteam teacher、dept movie、casting、actor 基础语句 select&from 基础查询select单列&多列&所有列&别名应用 例题一 例题二 例题三 select使用distinct去重 例题四 例题五…

Python在Excel工作表中创建数据透视表

在数据处理和分析工作中,Excel作为一个广泛使用的工具,提供了强大的功能来管理和解析数据。当面对大量复杂的数据集时,为了更高效地总结、分析和展示数据,创建数据透视表成为一种不可或缺的方法。通过使用Python这样的编程语言与E…

springboot整合h2

在 Spring Boot 中整合 H2 数据库非常简单。H2 是一个轻量级的嵌入式数据库&#xff0c;非常适合开发和测试环境。以下是整合 H2 数据库的步骤&#xff1a; 1. 添加依赖 首先&#xff0c;在你的 pom.xml 文件中添加 H2 数据库的依赖&#xff1a; <dependency><grou…

Web前端界面开发

前沿&#xff1a;介绍自适应和响应式布局 自适应布局&#xff1a;-----针对页面1个像素的变换而变化 就是我们上一个练习的效果 我们的页面效果&#xff0c;随着我们的屏幕大小而发生适配的效果&#xff08;类似等比例&#xff09; 如&#xff1a;rem适配 和 vw/vh适配 …

【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈

【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机&#xff0c;子弹&#xff0c;爆炸特效以及导出png序列图-优雅草央千澈 开发背景 优雅草央千澈所有的合集&#xff0c;系列文章可能是不太适合完全初学者的&#xff0c;因为课程不会非常细致的系统…

java项目之在线文档管理系统源码(springboot+mysql+vue+文档)

大家好我是风歌&#xff0c;曾担任某大厂java架构师&#xff0c;如今专注java毕设领域。今天要和大家聊的是一款基于springboot的在线文档管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 在线文档管理系统的主要使用者分为管…

可靠的人形探测,未完待续(III)

一不小心&#xff0c;此去经年啊。问大家新年快乐&#xff01; 那&#xff0c;最近在研究毫米波雷达模块嘛&#xff0c;期望用在后续的产品中&#xff0c;正好看到瑞萨的活动送板子&#xff0c;手一下没忍住。 拿了板子就得干活咯&#xff0c;我一路火花带闪电&#xff0c;开整…

【灵码助力安全3】——利用通义灵码辅助智能合约漏洞检测的尝试

前言 随着区块链技术的快速发展&#xff0c;智能合约作为去中心化应用&#xff08;DApps&#xff09;的核心组件&#xff0c;其重要性日益凸显。然而&#xff0c;智能合约的安全问题一直是制约区块链技术广泛应用的关键因素之一。由于智能合约代码一旦部署就难以更改&#xf…