附加共享数据库( 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.users
    UNION ALL
    SELECT 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

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

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

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

相关文章

vscode开启调试模式,结合Delve调试器调试golang项目详细步骤

1.前期准备 (1).在vs code中的扩展程序中搜索并安装Go扩展程序 (2).安装 Delve 调试器 go install github.com/go-delve/delve/cmd/dlvlatest (3).打开vs code的命令面板,输入Go: Install/Update Tools,并单击该命令执行,安装或更新Go语…

springboot和vue配置https请求

项目场景: 代码发布到线上使用https请求需要配置ssl证书,前后端都需要修改。 问题描述 如图,我们在调用接口时报如下错误,这就是未配置ssl但是用https请求产生的问题。 解决方案: 前端:在vite.config.js文…

每日学习30分轻松掌握CursorAI:Cursor基础设置与配置

Cursor基础设置与配置 一、基础设置概览 1. 设置项分类表 设置类别主要功能重要程度语言设置界面及AI交互语言配置★★★★★快捷键配置自定义操作快捷键★★★★☆外观设置主题、字体、颜色方案★★★☆☆编辑器设置缩进、换行、代码风格★★★★☆AI功能设置AI响应灵敏度、…

设计模式(观察者模式)

设计模式(观察者模式) 第三章 设计模式之观察者模式 观察者模式介绍 观察者模式(Observer Design Pattern) 也被称为发布订阅模式 。模式定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候…

QT 下拉菜单设置参数 起始端口/结束端口/线程数量 端口扫描4

上篇文章QT实现 端口扫描暂停和继续功能 3-CSDN博客 双击 添加对话框类 界面设计 由于主体代码已经写完,只需要更改参数的获取即可 获取起始端口结束端口的输入 槽函数 给主界面类添加调用对话框类的功能 实现功能:点击菜单项可以弹出对话框窗体 增加槽…

Unity自定义编辑器:基于枚举类型动态显示属性

1.参考链接 2.应用 target并设置多选编辑 添加[CanEditMultipleObjects] using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;[CustomEditor(typeof(LightsState))] [CanEditMultipleObjects] public class TestInspector :…

《代码随想录》Day31打卡!

《代码随想录》贪心算法:合并区间 本题的完整题目如下所示: 本题的完整思路如下所示: 1.本题依然是先对数组的左边界进行排序。将数组的第一个元素赋值给current。 2.遍历数组,判断current中的右边界和当前元素的左边界是否有重叠…

灵活运用事务回滚,快捷处理多张数据表格

各位编程宝子们(尤其是对MySQL了解不多的宝子们)在使用关系表处理时,有时候会希望简单一次性解决多张表的数据处理,但又有时候无从下手。其实有时候掌握数据的事务和回滚便可以简单解决这些事情,接下来我将以一个学生信…

Github提交Pull Request教程 Git基础扫盲(零基础易懂)

1 PR是什么? PR,全称Pull Request(拉取请求),是一种非常重要的协作机制,它是 Git 和 GitHub 等代码托管平台中常见的功能,被广泛用于参与社区贡献,从而促进项目的发展。 PR的整个过…

kvm 解决 安装windows 虚拟机cpu 核数问题

通过lscpu命令查到我本机的cpu信息如下 CPU(s): 12 —— 系统的总逻辑处理单元数量(包括所有核心和逻辑处理器)。Thread(s) per core: 2 —— 每个物理核心支持 2 个线程(表示启用了超线程技术)。Core(s) per socket: 6 —— 每个…

面向对象分析与设计Python版 面向对象分析方法

文章目录 前言一、名词法二、名词法-案例三、CRC卡片法四、分析模型法(了解) 前言 面向对象分析的目标:发现对象、定义对象之间的关系和属性。常用的面向对象分析方法有三种: 名词法CRC卡片法分析模型法 一、名词法 大型复杂系…

python基础和redis

1. Map函数 2. filter函数 numbers generate_numbers() filtered_numbers filter(lambda x: x % 2 0, numbers) for _ in range(5):print(next(filtered_numbers)) # 输出: 0 2 4 6 83. filter map 和 reduce 4. picking and unpicking 5. python 没有函数的重载&#xff0…

Vue2:el-table中的文字根据内容改变颜色

想要实现的效果如图,【级别】和【P】列的颜色根据文字内容变化 1、正常创建表格 <template><el-table:data="tableData"style="width: 100%"><el-table-column prop="id" label="ID"/> <el-table-column …

git提交

基本流程&#xff1a;新建分支 → 分支上开发(写代码) → 提交 → 合并到主分支 拉取最新代码因为当前在 master 分支下&#xff0c;你必须拉取最新代码&#xff0c;保证当前代码与线上同步&#xff08;最新&#xff09;&#xff0c;执行以下命令&#xff1a;bashgit pull orig…

Airflow:TimeSensor感知时间条件

在数据管道工作流中&#xff0c;任务可能需要在特定的时间执行&#xff0c;或者在继续之前等待一定的时间。为了满足这些需求&#xff0c;Apache Airflow提供了TimeSensor&#xff0c;这是一种内置Sensor&#xff0c;可以监控当前时间&#xff0c;并在达到指定时间时触发后续任…

JS爬虫实战演练

在这个小红书私信通里面进行一个js的爬虫 文字发送 async function sendChatMessage(content) {const url https://pro.xiaohongshu.com/api/edith/ads/pro/chat/chatline/msg;const params new URLSearchParams({porch_user_id: 677e116404ee000000000001});const messageD…

Center Loss 和 ArcFace Loss 笔记

一、Center Loss 1. 定义 Center Loss 旨在最小化类内特征的离散程度&#xff0c;通过约束样本特征与其类别中心之间的距离&#xff0c;提高类内特征的聚合性。 2. 公式 对于样本 xi​ 和其类别yi​&#xff0c;Center Loss 的公式为&#xff1a; xi​: 当前样本的特征向量&…

【Maui】动态菜单实现(绑定数据视图)

前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI&#xff0c;可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 .NET MAUI 是一款开放源代码应用&#xff0c;是 X…

【json】

JSON JSON是一种轻量级的,按照指定的格式去组织和封装数据的数据交互格式。 本质上是一个带有特定格式的字符串(py打印json时认定为str类型) 在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互,类似于计算机普通话 python与json关系及相互转换…

51单片机——中断(重点)

学习51单片机的重点及难点主要有中断、定时器、串口等内容&#xff0c;这部分内容一定要认真掌握&#xff0c;这部分没有学好就不能说学会了51单片机 1、中断系统 1.1 概念 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的&#xff0c;中断功能的存在&#…