数据表设计之主键自增、UUID或联合主键
最近在做数据库设计的时候(以MySQL为主),遇到不少困惑,因为之前做数据库表设计,基本上主键都是使用自增的形式,最近因为这种做法,被领导指出存在一些不足,于是我想搞明白哪里不足。
一、MySQL为什么建议使用自增?
通过网上查阅资料,得出一个这样的结论:
表的主键一般都要使用自增 id,不建议使用业务id ,是因为使用自增id可以避免页分裂。
按照我过去的实践:
选择使用自增可以避免很多麻烦,主要体现是数据的唯一性(从1到xxx,肯定不会重复的)。
1.什么是页分裂?
这块我没看太明白,我主要参考如下链接:
一看就懂的:MySQL数据页以及页分裂机制
二、UUID作为主键的优劣势是什么?以及它的应用场景是什么?
1.UUID和自增int型作为主键的比较,有哪些优势和劣势?
(1)优势
- UUID值在不同的表、数据库、甚至是服务器中都是全局唯一的,所以你可以合并来自不同数据库,甚至是不同服务器上不同数据库上的数据行;
- UUID值不会在URL中暴露你的数据信息。例如,一个客户可以通过 id10来访问他的账号地址 http://www.example.com/c/10/ ,他可以很轻松地猜到会有 id 11, 12等等的客户,这可能被拖库,或被别人猜到你的用户量;
- UUID值生成的时候不需要查一遍数据库,并且它还简化了应用层的逻辑。例如,当你要给父表和子表插入数据时,一般你要先把数据插到父表里,然后才能插到子表里。但是如果你用UUID的话,你可以直接生成父表的主键,然后在一个事务里同时把数据插到父表和子表里。
专业名词解释
拖库:指黑客通过各种社工手段、技术手段将数据库中敏感信息非法获取,一般这些敏感信息包括用户的账号信息如用户名、密码;身份信息如真实姓名、证件号码;通讯信息如电子邮箱、电话、住址等。
(2)劣势
- 存储UUID值(16字节)需要的存储空间比INT型(4字节)甚至是 BIGINT型(8字节)都要大;
- 调试起来会更难一些,你可以想象一下平时你只需要 WHERE id = 10 现在你要写 WHERE id = ‘df3b7cb7-6a95-11e7-8846-b05adad3f0ae’;
- UUID 值通常会因为它的大小和未被排序的问题导致性能问题。
2.哪些应用场景应该使用UUID作为主键?
简要概括UUID的适用场景:主要适合用在大型项目微服务架构中,保证全局ID唯一性(大型项目微服务架构集成各式各样的子系统,避免ID冲突)。
起初我在数据表设计的时候就与项目经理争论过,挺类似这个链接的对话:UUID与数字ID的区别与适用场景
三、什么是联合主键?联合主键的适用场景又是什么?
1.什么是联合主键
指用2个或者是2个以上的字段组成的主键,用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且附加上了主键索引。
2.联合主键的适用场景是什么?
我能想到一个用户信息,针对某个一个区域如果用用户ID或用户ID+用户姓名作为主键,难以保持数据的唯一性,因为这一个地区不仅仅是有一个小马哥,可能有七八个人,如此,前面提到的用户ID或用户ID+用户姓名显然是行不通的,这时可以把身份证加入主键,变成了用户ID+用户姓名+身份证(形成了一个联合主键),这样一来该用户数据的唯一性得到了验证。当然了,联合主键的场景不仅仅是这个,关键看业务场景。
四、数据表设计心得分享
从外包公司->创业公司->教育公司->现在所在公司,回过头来看过去我的数据表设计方面,存在的一个最大不足,即着重考虑技术实现难易层面,而轻视业务场景适用性、扩展性、稳定性等。
数据表设计之主键自增、UUID或联合主键的更多相关文章
- python学习之老男孩python全栈第九期_数据库day001知识点总结 —— MySQL操作数据库以及数据表、基本数据类型、基本增删改查、外键定义以及创建
一. 学习SQL语句规则以及外键 1. 操作文件夹 create database db2; 创建文件夹 create database db2 default charset utf8; 创建文件夹 ...
- 【原创】C#搭建足球赛事资料库与预测平台(6) 赔率数据表设计2
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录 本篇文章开始将逐步介 ...
- 【原创】C#搭建足球赛事资料库与预测平台(3) 基础数据表设计
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 开源C#彩票数据资料库系列文章总目录:http://www.cn ...
- 【原创】C#搭建足球赛事资料库与预测平台(4) 比赛信息数据表设计
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录 本篇文章开始将逐步介 ...
- SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(五): 数据表设计、使用 jwt、redis、sms 工具类完善注册登录逻辑
(1) 相关博文地址: SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(一):搭建基本环境:https://www.cnblogs.com/l-y-h/p ...
- PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [5] 版本设计分析及数据表设计
APP 版本升级以及 APP 演示 ① 版本升级分析以及数据表设计 ② 版本升级接口开发以及 APP 演示 /** * version_upgrade 版本升级信息表 */ CREATE TABLE ...
- MySql数据表设计,索引优化,SQL优化,其他数据库
MySql数据表设计,索引优化,SQL优化,其他数据库 1.数据表设计 1.1数据类型 1.2避免空值 1.3text类型优化 2.索引优化 2.1索引分类 2.2索引优化 3.SQL优化 3.1分批 ...
- mysql status关键字 数据表设计中慎重使用
mysql status关键字 数据表设计中慎重使用
- 中小型WEB系统权限日志数据表设计
中小型WEB系统权限日志数据表设计 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjc1MDU3OA==/font/5a6L5L2T/fontsi ...
随机推荐
- HaiYaaaa & 嗨呀
HaiYaaaa & 嗨呀 海呀... 嗨呀... refs Uncle Roger https://www.youtube.com/results?search_query=uncle+Ro ...
- taro 小程序 & touch event 转换 bug
taro 小程序 & touch event 转换 bug before after 事件处理 https://nervjs.github.io/taro/docs/event.html#do ...
- js 实现简单的parseInt和parseFloat
function myParseInt(str: string): number { let result = NaN; for (let i = 0; i < str.length; i++) ...
- 负利率时代,NGK DeFi是否会推动资本向加密货币迁徙?
2020年,全球经济危机持续,贸易战争以及天灾人祸使得全球各国的经济雪上加霜,为了挽救低迷的经济,美国.欧洲.日本各国央行竞相放水,全球正在滑入负利率时代. 负利率下,资本加速从法币向数字货币迁徙,因 ...
- 蓝桥杯——试题 算法训练 Yaroslav and Algorithm
试题 算法训练 Yaroslav and Algorithm 资源限制 时间限制:100ms 内存限制:128.0MB 问题描述 (这道题的数据和SPJ已完工,尽情来虐吧!) Yaroslav喜欢算法 ...
- 01.Numpy数组的基本应用
数组的创建 数组的访问 数组的合并 数组的分割 数组创建 >>> import numpy as np 创建一维数组 >>> x = np.arange(10) & ...
- 处理ios键盘弹出按钮点击click失效
用ontouchstart绑定事件即可,然后用 document.activeElement.blur();让键盘收起 this.value = value.replace(/\s/g, " ...
- python进阶(6)深拷贝和浅拷贝
深拷贝和浅拷贝 不管对于浅拷贝.还是深拷贝,针对不可变对象str.int.tuple(有点特殊).boolean,它的内存地址是不变的,拷贝的仅仅是值 import copy a = 1 b = co ...
- 高级FTP
一.作业需求 1. 用户加密认证(已完成) 2. 多用户同时登陆(已完成) 3. 每个用户有自己的家目录且只能访问自己的家目录(已完成) 4. 对用户进行磁盘配额.不同用户配额可不同(已完成) 5 ...
- 后端程序员之路 24、Redis hiredis
Redishttps://redis.io/ Redis快速入门 - Redis教程http://www.yiibai.com/redis/redis_quick_guide.html wget ht ...