当前位置: 首页 > news >正文

分布式id、系统id、业务id以及主键之间的关系

推荐

连分布式ID都理解不了,你是刚培训出来冒充面试官的吧

1 分布式id、系统id、业务id以及主键之间的关系

  1. 分布式ID、系统ID、业务ID和主键的关系:
  • 分布式ID:在分布式系统中,由于存在多个独立的节点,为了保证每个节点生成的ID都是全局唯一的,就需要用到分布式ID。它是全局唯一的,可以用作数据库的主键。

  • 系统ID:一般用来在一个系统或者平台内部区分不同的用户、订单等,不一定是全局唯一的,所以不能用作分布式系统中的主键。

  • 业务ID:业务ID是根据业务逻辑生成的ID,它的生成规则可能会包含一些业务信息,如时间、地点等。它可以是全局唯一的,也可以只在某个业务范围内唯一。

  • 主键:数据库表中的主键是用来唯一标识一条记录的,它必须是唯一的。在分布式系统中,主键一般会使用分布式ID来保证全局唯一。

2 为什么不能用主键id充当订单id

  1. 为什么不能用主键ID充当订单ID?

主键ID是数据库中用于唯一标识记录的,而订单ID是业务中用来标识一个订单的。虽然在技术上可能可以使用主键ID作为订单ID,但这样做会有一些问题:

  • 从业务逻辑的角度看,订单ID一般需要包含一些业务相关的信息,如时间、订单类型等,而主键ID通常是无业务含义的。

  • 主键ID可能会由数据库自动递增生成,如果直接暴露给用户,可能会泄露一些敏感信息,如订单数量等。

  • 如果系统升级或迁移,主键ID可能会发生改变,这会影响到业务的持续性。

3 为什么业务id和主键id不能一样

  1. 为什么业务ID和主键ID不能一样?

业务ID和主键ID的生成规则和用途是不一样的。业务ID是根据业务逻辑生成的,可能会包含一些业务相关的信息,而主键ID一般是数据库自动生成的,没有业务含义。

另外,业务ID可能会因为业务的变化而变化,而主键ID一旦确定,就不应该发生改变。如果把业务ID和主键ID设置为一样的,那么当业务ID需要改变时,就可能会影响到数据库的主键,从而影响到数据的完整性。

4 分布式id是解决什么问题

  1. 分布式ID是解决什么问题?

分布式ID主要是解决分布式系统中全局唯一标识的问题。在分布式系统中,由于存在多个独立的节点,每个节点可能都需要生成ID,为了保证所有节点生成的ID都是全局唯一的,就需要使用分布式ID。

另外,分布式ID还可以解决一些其它的问题,如:

  • 数据库的分片问题:通过合理的设计分布式ID,可以将数据均匀的分布在不同的数据库或者表中,提高查询的效率。

  • 订单的生成问题:在电商等需要大量生成订单的业务中,分布式ID可以快速的生成大量的全局唯一的订单号。

  • 数据追踪问题:在复杂的系统中,通过分布式ID,可以更容易的追踪一条数据的流转过程。

分库分表和扩展

1. 怎么分库分表:

分库分表是为了解决单一数据库或者单一数据表承载量问题的一种常用的方法。分库是将一个数据库的数据拆分到多个数据库中,分表则是将一个表的数据拆分到多个表中。以下是分库分表的一般步骤:

  • 确定拆分的方式:分库还是分表,或者两者同时进行。这主要取决于你的系统瓶颈在哪里,是在单个数据库的处理能力,还是在单个表的数据量。

  • 设计拆分规则:这通常需要根据业务特点来进行,常见的方式有按照用户ID、地理位置、时间等进行拆分。

  • 修改应用程序:拆分后的数据库和表的结构与原来的不同,需要修改应用程序中的数据库操作代码。

  • 数据迁移:将原来的数据按照新的拆分规则迁移到新的数据库和表中。

  • 引入中间件:为了使应用程序对分库分表透明,通常会引入一些数据库中间件,如ShardingSphere、Mycat等。

2. 为什么分库分表要考虑引入一个横向扩展的分布式数据库呢?

横向扩展的分布式数据库,或称为数据库分片,能有效地处理大量数据和高并发的情况。通过将数据分散到多个数据库节点上,可以提高系统的处理能力和吞吐量,从而提高系统的可扩展性和稳定性。

另外,引入一个横向扩展的分布式数据库,还可以提高数据的可用性。如果一个节点出现故障,其他节点还可以继续提供服务,从而保证了系统的可用性。

最后,使用分布式数据库,可以简化分库分表的操作。很多分布式数据库产品,如CockroachDB、TiDB等,都提供了内建的分片功能,可以自动进行数据的分布和迁移,大大简化了分库分表的操作。

3. 分库分表跟ID的关系:

分库分表的策略往往与ID有关。ID是一个常用的拆分依据,例如:

  • 可以按照用户ID进行拆分,比如将用户ID为奇数的用户的数据存储在一组数据库中,将用户ID为偶数的用户的数据存储在另一组数据库中。

  • 可以按照订单ID进行拆分,比如按照订单ID的某几位进行哈希,然后根据哈希值来决定存储到哪个数据库或者哪个表中。

此外,分布式ID生成策略也常被用于分库分表。通过在ID中包含一些特定的信息,比如时间、机器编号等,可以用于直接或间接地决定该数据应该存储在哪个数据库或哪个表中。例如,Twitter的Snowflake算法就是一个常用的分布式ID生成策略。

分库分表、水平划分和垂直划分都是数据库架构中为了解决数据量大或者并发访问量大导致的性能问题而采用的策略。他们之间的关系和特点如下:

  1. 分库分表:分库是指将一个数据库拆分为多个数据库,分表则是将一个大表拆分为多个小表。分库分表可以既包含水平划分也可以包含垂直划分,具体取决于分库分表的方式。

  2. 水平划分(Horizontal Partitioning):是指按照数据的行进行拆分,将一个表的数据根据某些规则分散到多个具有相同结构的表中。例如,根据用户ID的奇偶性进行分表,所有奇数ID的用户数据存放在一张表,偶数ID的用户数据存放在另一张表。这种方式是分库分表的一种常用策略。

  3. 垂直划分(Vertical Partitioning):是指按照数据的列进行拆分,将一个表的某些列数据拆分到另一个或多个表中。例如,一个用户信息表,包含用户的基本信息和详细信息,可以将基本信息和详细信息分别存放在两个表中。垂直划分也可以用于分库,将不同的表放到不同的数据库中。

总结来说,分库分表是为了解决数据库性能问题的一个总体策略,而水平划分和垂直划分则是实现分库分表的具体技术手段。

水平划分和水平扩展数据库很像,都借用了分片吗

是的,水平划分和水平扩展的数据库(也称为分布式数据库或数据库分片)在很多方面是相似的,它们都是通过将数据分散到多个数据库或数据表中来提高系统的性能和可扩展性。实际上,你可以将水平划分看作是水平扩展的一个子集或者具体实现方式。

水平划分是在应用程序层面进行的,它需要应用程序知道如何路由到正确的数据库或表,因此通常需要修改应用程序的代码。而水平扩展的数据库,如Cassandra,MongoDB和Google Cloud Spanner等,通常会提供一个统一的接口,应用程序可以像访问一个单一的数据库一样访问它,由数据库系统自动处理数据的分布和路由。

在水平划分和水平扩展的数据库中,都会使用到分片的概念。分片是指将数据划分为多个独立的部分,每个部分称为一个分片,每个分片可以存储在不同的物理设备上。分片的规则可以根据业务需求来定,常见的规则有按照范围分片、按照哈希分片等。

相关文章:

分布式id、系统id、业务id以及主键之间的关系

推荐 连分布式ID都理解不了,你是刚培训出来冒充面试官的吧 1 分布式id、系统id、业务id以及主键之间的关系 分布式ID、系统ID、业务ID和主键的关系: 分布式ID:在分布式系统中,由于存在多个独立的节点,为了保证每个节…...

设计模式七:适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口能够协同工作。 适配器模式涉及角色: 目标接口(Target Interface)&#xff1a…...

数据结构---队列

(一)队列之基础补充 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 —— 百科 「队列 Queue」是一种…...

chatGPT在软件测试中应用方式有哪些?

ChatGPT可以在软件测试中以以下方式应用: 1. 自动化对话测试:ChatGPT可以用于自动化对话测试,模拟用户与软件系统进行实时对话。它可以扮演用户的角色,向系统发送各种类型的指令和请求,并验证系统的响应是否符合预期。…...

chatgpt 接口使用(一)

使用api实现功能 参考链接:https://platform.openai.com/examples 安装库: pip3 install openai 例如: import os import openaiopenai.api_key os.getenv("OPENAI_API_KEY") response openai.ChatCompletion.create(model&q…...

【个人笔记】Linux 服务管理两种方式service和systemctl

service命令与systemctl 命令 service 命令与传统的 SysVinit 和 Upstart 初始化系统相关。较早期的 Linux 发行版(如早期的 Ubuntu、Red Hat 等)使用了这些初始化系统。service 命令用于启动、停止、重启和查询系统服务的状态。虽然许多现代 Linux 发行…...

HCIP中期考试实验

考试需求 1、该拓扑为公司网络,其中包括公司总部、公司分部以及公司骨干网,不包含运营商公网部分。 2、设备名称均使用拓扑上名称改名,并且区分大小写。 3、整张拓扑均使用私网地址进行配置。 4、整张网络中,运行OSPF协议或者BGP…...

【WebRTC---源码篇】(二十二)WebRTC的混音处理

音频混音主力 音频混音主体主要通过(重采样) + (混音)为主 音频重采样 内容实现是在webrtc::voe中实现的,下面来对重采样全流程逐一分析 。 void RemixAndResample(const AudioFrame& src_frame,//源音频数据帧PushResampler<int16_t>* resampler,//重采样对…...

MTK system_server 卡死导致手机重启案例分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、MTK AEE Log分析工具二、AEE Log分析流程三、system_server 卡死案例分析及解决 本文主要针对 Exception Type: system_server_watchdog , system_…...

加强 Kubernetes 能力:利用 CRD 定义多版本资源的实现方式

姚灿武&#xff0c;Rancher 中国研发工程师&#xff0c;拥有 7 年云计算领域经验&#xff0c;热衷开源技术&#xff0c;在云原生相关技术领域拥有丰富的开发和实践经验。 CRD&#xff0c;即自定义资源定义&#xff08;Custom Resource Definition&#xff09;&#xff0c;是 Ku…...

区块链应用 DApp 开发需要掌握的技能

文章目录 前言为什么要开发 DAppDApp 的优势DApp 应用范围DApp 开发者技能 前言 前面区块链系列的文章中介绍了区块链技术、智能合约、web3js&#xff0c;Solidity 编程语言&#xff0c;在开发者的角度就是要基于这些知识在Web3时代去开发一个 DApp&#xff08;去中心化应用程…...

关于新版本selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘等问题

由于一段时间没有使用Selenium&#xff0c;当再次使用时发现之前写的Selenium元素定位的代码运行之后会报错&#xff0c;发现是Selenium更新到新版本&#xff08;4.x版本&#xff09;后&#xff0c;以前的一些常用的代码的语法发生了改变&#xff0c;当然如果没有更新过或是下载…...

c++通过自然语言处理技术分析语音信号音高

对于语音信号的音高分析&#xff0c;可以使用基频提取技术。基频是指一个声音周期的重复率&#xff0c;也就是一个声音波形中最长的周期。 通常情况下&#xff0c;人的声音基频范围是85Hz到255Hz。根据语音信号的基频可以推断出其音高。 C中可以使用数字信号处理库或语音处理库…...

[pymc3][python]pymc3安装后测试代码2

测试环境&#xff1a; pymc33.11.2 代码&#xff1a; import numpy as np import pymc3 as pm import matplotlib.pyplot as pltif __name__ __main__:# 生成随机数据np.random.seed(123)x np.linspace(0, 1, 100)y 0.5 * x np.random.normal(0, 0.1, size100)# 定义概率…...

Go语言time库,时间和日期相关的操作方法

time库 用于处理时间、日期和时区的核心库。在实际开发中&#xff0c;常常需要与时间打交道&#xff0c;例如记录日志、处理时间差、计算时间间隔等等。因此&#xff0c;掌握time库的使用方法对于Go开发者来说非常重要。 在Go语言中&#xff0c;时间表示为time.Time类型&…...

JVM总结笔记

JVM JVM是什么?JVM 的主要组成部分JVM工作流程JVM内存模型直接内存与堆内存的区别&#xff1a;堆栈的区别Java会存在内存泄漏吗&#xff1f;简述Java垃圾回收机制垃圾收集算法轻GC(Minor GC)和重GC(Full GC)新生代gc流程JVM优化与JVM调优 JVM是什么? JVM是Java Virtual Mach…...

C++ 缓存再排序,解决多线程处理后的乱序问题,不知道思路对不对[挠下巴]

C 缓存再排序&#xff0c;解决多线程处理后的乱序问题&#xff0c;不知道思路对不对[挠下巴] 使用map默认会根据key排序的原理作缓存&#xff0c;队列满了依次推出&#xff0c;抛弃掉过时的数据 #include <functional> #include <iostream> #include <map> #…...

华为数通HCIA-地址分类及子网划分

ip地址&#xff08;逻辑地址&#xff09; 作用&#xff1a;唯一标识一张网卡 特点&#xff1a;设备天生没有&#xff0c;需要人为配置&#xff0c;可以随时修改 格式&#xff1a;点分十进制 大小&#xff1a;32bit 组成&#xff1a;网络位主机位 网络位&#xff1a;用于标…...

Linux第七章之gdb与makefile使用

一、Linux调试器-gdb使用 1.1背景 程序的发布方式有两种&#xff0c;debug模式和release模式Linux gcc/g出来的二进制程序&#xff0c;默认是release模式要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上-g 选项&#xff3b;重要&#xff3d; 1.2开始使用 …...

Mycat-Balance使用指南

MyCAT Balance是一个Java NIO的高性能负载均衡器&#xff0c;可以替代普通的硬件的交换机或其LVS类似的复杂机制&#xff0c;实现MyCAT集群的负载均衡。 MyCAT Balance的配置文件在conf目录下&#xff0c;frontend-conf.为前端配置&#xff0c;包括绑定的端口等&#xff0c;js…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

Qt/C++学习系列之列表使用记录

Qt/C学习系列之列表使用记录 前言列表的初始化界面初始化设置名称获取简单设置 单元格存储总结 前言 列表的使用主要基于QTableWidget控件&#xff0c;同步使用QTableWidgetItem进行单元格的设置&#xff0c;最后可以使用QAxObject进行单元格的数据读出将数据进行存储。接下来…...

MCP和Function Calling

MCP MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09; &#xff0c;2024年11月底&#xff0c;由 Anthropic 推出的一种开放标准&#xff0c;旨在统一大模型与外部数据源和工具之间的通信协议。MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而…...