数据库表设计是项目开发中逃不掉的问题,每一张表,我们都会设计一个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设计方案。

ultraedit许可证id 7位数字_优雅的数据库ID设计相关推荐

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

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

  2. java 正则首位8或者9的8位数字_从零开始学Python - 第025课:正则表达式的应用

    正则表达式相关知识 在编写处理字符串的程时,经常会遇到在一段文本中查找符合某些规则的字符串的需求,正则表达式就是用于描述这些规则的工具,换句话说,我们可以使用正则表达式来定义字符串的匹配模式,即如何检 ...

  3. id长度 雪花算法_分布式系统中唯一ID算法之雪花算法

    背景 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种 ...

  4. 下载行政区划mysql表设计_行政区划数据数据库的设计(脚本)

    /************************************************************* Author:   LzmTW(水如烟) Create date: 200 ...

  5. mysql设计积分兑换表_积分系统数据库表设计.docx

    积分系统数据库表设计 文件编号:JHDZ/SJ 密 级: 云上城积分功能数据库设计文档 项目名称:<云上城>项目代号:XXX版 本:V1.0编制单位:平台运营编制日期:2014-10-08 ...

  6. java 正则首位8或者9的8位数字_正则简单手机号和邮箱练习

    正则表达式的组成规则 在java中,正则表达式的编译是类 java.util.regex.Pattern 正则表达式的构造摘要 1.字符x 包括所有大写和小写字母.所有数字.所有标点符号和一些其他符号 ...

  7. 正则获取前8位数字_数据取整,获取字符串前数字另辟蹊径之LOOKUP

    看到标题,数据取整,获取字符串前数字,用LOOKUP函数?EK你确定没搞错吗?是的,当然没有搞错.今天,我们会用LOOKUP来数据取整,获取字符串前数字. 首先我们来看一下数据取整效果图: 图1 取整 ...

  8. java生成不重复8位数字_如何生成8位随机不重复的数字编号

    在Java中难免会使用到生成随机不重复的数字编号的时候,那么你知道如何生成8位随机不重复的数字编号吗?下面我们就跟爱站小编一起去看看吧. package com.jjinfo.common.util; ...

  9. 批量生成6位数字_分享一款可做各种流水号的条码生成软件

    对于刚接触条码生成软件的新用户,在条码生成软件中设计可变数据条码或者流水条码时,可能会有一点困难,如果一个一个的设计条码,不仅费时费力,还容易出错.特别是需要设计一些跳号的流水条码时,更是难上加难.其 ...

最新文章

  1. excel操作----主要用于数据库入库
  2. Adobe将于2020年末停止对Flash的支持
  3. Windows下Unity5x的安装
  4. 数学之美系列十七 -- 谈谈搜索引擎作弊问题(Search Engine Anti-SPAM)
  5. 模式 - 收藏集 - 掘金
  6. python进行矩阵计算公式_纯python进行矩阵的相乘运算的方法示例
  7. mybatis与hibernate不同(重要)
  8. Gradle 插件Debug调试
  9. gpt分区安装的Win7激活工具
  10. 高频变压器漆包线规格的确定
  11. 算法——排序——冒泡排序图解动画
  12. jsp的九大内置对象以及作用
  13. soap报文解析 php,soap 返回报文解析
  14. python京东预约抢购_python 脚本实现京东抢购
  15. 微信无法直接打开淘宝链接是怎么回事?
  16. PDF文件太大无法上传,如何压缩变小?
  17. 揭秘曝光所有互联网赚钱的秘密及方法
  18. 从三字经看古代幼儿教育
  19. 写字墨水市场前景分析及研究报告
  20. 最简单的无线电中继——录音中继

热门文章

  1. 澳门W.B.C开启世界区块链“峰会+嘉年华+学院+全球行”新模式
  2. 阿里云对腾讯企业邮箱设置域名解析
  3. 线性代数 向量组 线性相关与表出 秩 解的关系总(一)
  4. img标签src引入svg如何修改颜色
  5. 记一次python考试题
  6. 等保分保关保密评|四道防线守护网络信息安全
  7. PS混合模式图文详解
  8. 用蒲公英进行内测更新
  9. Photoshop教程二:液化色彩原理
  10. BFT-SMaRt:用Netty做客户端的可靠信道