附加共享数据库( 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 …

SQL进阶实战技巧:统计用户的累计消费金额及VIP等级?

目录 0 问题描述 1 数据准备 2 代码实现 3 问题拓展 问题延伸:查询首次下单后第二天连续下单的用户比率

鸿蒙面试 2025-01-11

ArkTs 和TS的关系? ArkTS(方舟开发语言)与 TypeScript(TS)存在紧密联系,同时也有显著区别: 联系 语法基础:ArkTS 在语法层面大量借鉴了 TypeScript ,TypeScript 里诸如…

SpringCloud项目搭建快速入门

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

vue(2,3), react (16及以上)开发者工具资源

在前端开发的广阔领域中,Vue.js 和 React.js 作为两大主流框架,各自拥有庞大的用户群体和丰富的生态系统。为了帮助开发者更高效地进行调试和开发,Vue Devtools 和 React 开发者工具应运而生,成为这两个框架不可或缺的辅助工具。本…

芯片:为何英伟达的GPU能在AI基础设施领域扮演重要角色?

英伟达的GPU之所以能在AI基础设施领域扮演重要角色,主要源于其硬件架构的优势以及其与深度学习算法的高度兼容性。以下是几个关键因素: 1. 并行计算能力 GPU(图形处理单元)本质上是为处理大量并行计算任务而设计的。与CPU相比&a…

新手入门 React .tsx 项目:从零到实战

🚀 新手入门 React .tsx 项目:从零到实战 💻✨ 如果你是 React 新手,刚接触 .tsx 文件,不要担心!跟着这份指南,一步一步来,你很快就能上手了!👇 &#x1f4d…

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(即对象)的外观或位…

【云计算】OpenStack云计算平台

OpenStack云计算平台框架搭建 1.先换源 先换成阿里源: curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 2.安装框架 yum -y install centos-release-openstack-train 3.安装客户端 yum -y install python-openstackclient 但…

如何让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…