数据库表设计是项目开发中逃不掉的问题,每一张表,我们都会设计一个ID主键字段,关于表ID的生成方式,每个人都有自己的见解,我们就来讨论如何优雅的设计数据库ID

自增ID

这种方式用起来最简单,也是很多程序员喜欢用的方式。使用方法:mysql有auto_increment;oracle里有sequence

这种方式的缺点很明显,容易被探测,假设我是一个博客系统,某一遍文章的id=10,那么显示在浏览器上的地址大概是这样子:www.xxxx.com/article?id=10,对于有点程序经验的人来说,他就会直接在浏览器上打www.xxxx.com/article?id=11,id=12等,更甚的可以用postman,jmeter等http测试工具,这样就可以探测出所有的文章。博客文章系统可能还不要紧,但如果是一些商城系统,就容易泄露重要信息,比如系统有多少笔订单,每笔订单的金额、状态都可以被试探出来。

还有一个缺点,当我们在做一个新增操作时,这个ID是数据库自增的,但是代码业务层并不知道,如果我们要拿这个ID做其他操作,这时就只能重新查一遍数据库了。

数据库UUID

这种方式解决了自增ID容易被探测的问题,使用方法:mysql的uuid()函数,生成出来是32位的16进制数,在有生之年不会有重复,如下图:

但是它依然有一个缺点,就是新增操作时,业务层不知道ID,非要重新查一遍数据库才知道。

JAVA生成UUID

这种方式解决了数据库UUID的一个问题,ID是JAVA代码生成的,减少了一次数据库查询。这种方式是大多数项目在使用的方式,具体代码如下

public class UuidUtil {/*** 获得一个UUID*/public static String getUUID(){String uuid = UUID.randomUUID().toString();//去掉“-”符号return uuid.replaceAll("-", "");}
}

优雅的短UUID

JAVA生成UUID的方式虽然已经很通用了,但是依然有一个小缺点,占用的空间太大,所有表的ID都要占用32位的字符。所以我自己设计了一个短UUID,原理就是生成一个8位的62进制数,将所有的数字、大小写字母全部用上(数据库UUID是16进制,只用了数字和6个字母)。代码如下

public class UuidUtil {public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f","g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s","t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I","J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V","W", "X", "Y", "Z" };public static String getShortUuid() {StringBuffer shortBuffer = new StringBuffer();String uuid = UUID.randomUUID().toString().replace("-", "");for (int i = 0; i < 8; i++) {String str = uuid.substring(i * 4, i * 4 + 4);int x = Integer.parseInt(str, 16);shortBuffer.append(chars[x % 0x3E]);}return shortBuffer.toString();}
}

生成的ID如下:

将UUID的32位的16进制数,每4位转成62进制,看不懂的直接用就是了,这样的短ID不仅有UUID不重复的特性,还不占用空间,8位ID在一些查询等操作的性能上也优于32位ID,这就是优雅的UUID设计方案。

优雅的数据库表ID的设计方案相关推荐

  1. Mybatis 向数据库表中插入记录 不携带id值

    MapperXml.xml文件 <insert id="addNews" parameterType="com.tedu.pojo.News"  useG ...

  2. oracle 新增字段id 并赋值32位_优雅的数据库ID设计

    数据库表设计是项目开发中逃不掉的问题,每一张表,我们都会设计一个ID主键字段,关于表ID的生成方式,每个人都有自己的见解,我们就来讨论如何优雅的设计数据库ID 自增ID 这种方式用起来最简单,也是很多 ...

  3. ultraedit许可证id 7位数字_优雅的数据库ID设计

    数据库表设计是项目开发中逃不掉的问题,每一张表,我们都会设计一个ID主键字段,关于表ID的生成方式,每个人都有自己的见解,我们就来讨论如何优雅的设计数据库ID 自增ID 这种方式用起来最简单,也是很多 ...

  4. 数据库表初始化,删除所有数据后主键ID从1开始

    数据库表初始化,删除所有数据后主键ID从1开始 语法:TRUNCATE TABLE "表格名" 例子:truncate table testtable 转载于:https://ww ...

  5. JAVA生成UUID并作为数据库表的ID

    在接触UUID之前,我建表用的ID一直是用的int型,然后自动增长,这样很方便. 但是这样做却有一些问题,因为数据量大的话,不可能只用一张表,而是几张表,这样会出现id重复,于是有了UUID. UUI ...

  6. Access把每一天的数据累加_如何设计 QQ、微信等第三方账号登陆 ?以及设计数据库表!...

    来源:http://suo.im/5SBVka 多账户的统一登录 名称解释 这里的多账户区别于系统级别的,我们讲的多账户系统是指,在我们互联网应用当中,我们的应用会使用多个第三方账号进行登录,比如现在 ...

  7. 【Normal Form】数据库表结构设计所遵从的范式

    目录 1. 第一范式:原子性,不可再分 1.1. 是否为原子性 1.2. 典型的例子:多个信息用分隔符拼接记录 2. 第二范式:非主键必须完全依赖于主键,而不能只依赖于主键的一部分 2.1. 不符合此 ...

  8. token 微信access 过期_如何设计 QQ、微信等第三方账号登陆 ?以及设计数据库表!...

    来源:http://suo.im/5SBVka 多账户的统一登录 名称解释 这里的多账户区别于系统级别的,我们讲的多账户系统是指,在我们互联网应用当中,我们的应用会使用多个第三方账号进行登录,比如现在 ...

  9. 面试官问我:如何设计 QQ、微信等第三方账号登陆 ?还要我说出数据库表设计!...

    公众号关注 "GitHubDaily" 设为 "星标",每天教你学编程! 低调的码农  | https://sourl.cn/tzZUzN 多账户的统一登录 名 ...

最新文章

  1. flutter TextField 输入框被软键盘挡住的解决方案
  2. IOS 开发-- 常用-- 核心代码
  3. php zip 编码,encoding - 用PHP如何检测一个ZIP包内的文件是在何种编码的系统下创建的...
  4. app aws_服务网格:Istio和AWS App Mesh
  5. java无符号 uuid,java实现无符号数转换、字符串补齐、md5、uuid、随机数示例
  6. 每日一题(17)—— 关键字volatile的作用和三个不同的应用场合
  7. Android开发笔记(一百四十)Word文件的读取与显示
  8. 104种***清除方法
  9. ziplist之详细分析
  10. matlab dot函数
  11. 51单片机三种烧录的方法介绍
  12. 计算机ppt教案设计大赛,广东省创新杯说课大赛计算机类一等奖作品:PPT电子相册制作教学设计...
  13. 云计算与大数据技术 第一章
  14. 生意的本质:低买高卖
  15. 【CANopen】CAN总线的高级协议详解
  16. 宝藏平台——阿里云云效DevOps
  17. 种群遗传学的多态性衡量参数
  18. 吃货联盟订餐系统项目
  19. 手游测试工具-脚本精灵
  20. 喜报销无缝接入微信企业号 企业员工可在微信上移动报销

热门文章

  1. 故障分析 | 从 data_free 异常说起
  2. P2415 集合求和(一道洛谷好题鸭)(虽然可以水过,但有必研究DP)
  3. 小程序云开发中的一些注意点与Error: errCode: -404011 cloud function execution error | errMsg: clou----错误
  4. (艾迪茉莉转圈圈~~找最小环)Circular Sequence UVA - 1584
  5. 百度 2021 Lic 机器阅读理解比赛有感
  6. Invalid content was found starting with element ‘{“http://maven.apache.org/POM/4.0.0“:dependency}‘.
  7. bat批量修改文件名
  8. php 元旦祝福,元旦祝福语
  9. (转)War3 World Editor 菜单详解
  10. 2019年—可能是我们Java程序员离危机感最近的一年!