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

oracle 新增字段id 并赋值32位_优雅的数据库ID设计相关推荐

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

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

  2. java 连接 oracle 10_java 怎么把原本连接32位oracle10g换到连接64位oracle10g

    经过各种折腾,终于解决了这个问题.参考了各论坛的方案,解决办法如下: 1.格式化电脑,重装操作系统和SQL Server 2012.因为看到有一种说法是64位的SQL Server安装的路径中有pro ...

  3. 在64位的环境中使用VS建立Web项目进行Oracle连接需要注意WebDev是32位的

    我们平时使用的都是32位的机器进行开发,装的都是32位的软件,但是我们的服务器一般都是64位的,所以有时也需要在64位的环境下装一个VS调试程序.最近遇到的一个问题就是一个同事换了一个电脑,用的是X6 ...

  4. oracle client 11.2.0.3 32位,oracle client 32位/64位下载(Oracl数据库)

    今天给大家推荐的这款oracle client软件是一款功能丰富的数据库管理系统,支持32位/64位系统,用户可以通过该Oracl数据库工具执行OCI.OCCI.PRO*C.ODBC和JDBC程序,o ...

  5. oracle 10g 10.2.0.4 32位升级到64位

    32位升到64位有以下几种方法: 1.copy datafile后运行脚本升级 2.rman restore后运行脚本升级 3.通过exp/imp,expdp/impdp的transfer table ...

  6. 思科模拟器32位_三款另类的68k Mac模拟器

    之前说过两个主流的68k Mac模拟器,Mini vMac和BasiliskII.不过它们都没有真正的硬盘模拟,都是通过外置的软驱接口连接的"硬盘".那么这篇文章将介绍三款非主流的 ...

  7. git 32位_完整的GIT笔记 快速上手小白教程

    GIT 是什么? Git 是目前世界上最先进的分布式版本控制系统.并且它是一个免费的.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 什么是版本控制系统 版本控制是一种系统,它跟踪一 ...

  8. python安装方法32位_【Python】pycharm安装32位win7出现的问题解决办法。

    1.安装 PyCharm 是一款功能强大的 Python 编辑器,具有跨平台性,鉴于目前最新版 PyCharm 使用教程较少,为了节约时间,来介绍一下 PyCharm 在 Windows下是如何安装的 ...

  9. sql server 配置管理器里为什么是32位_死磕 Nginx 系列:Nginx 限流配置

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 限流算法:令牌桶算法 算法思想是: 令牌以固定速率产生,并缓存到令牌桶中: 令牌桶放满时,多余的令牌被丢弃: 请求要消耗等比例的令牌才能被处 ...

最新文章

  1. ontouchevent android,android onTouchEvent处理机制总结(必看)
  2. [转]一份ASP内存的释放的实验报告
  3. qchart 图表_QChart双Y轴实时更新曲线图
  4. html怎么修改锚点的属性,在HTML中设置自定义锚点
  5. cli vue 卸载_记录使用@vue/cli搭建Vue3项目完整流程
  6. 对Boost.Asio中异步事件循环的理解
  7. pdfminer将pdf转为csv
  8. 汇编语言 写 Hello World
  9. QChart入门教程-绘制正弦曲线
  10. ntds(600)ntdsa:系统错误1453配额不足及恢复过程记录
  11. 函数计算机使用说明,SHARP-EL506P 函数计算器的使用说明
  12. vue获取上一个页面路由地址
  13. 喜报|Authing 入选 CNCF Landscape 云原生技术图谱
  14. 首位文博虚拟宣推官“文夭夭”上岗
  15. 华为路由器负载均衡_华为OSPF路由负载分担配置示例
  16. GBase 8a MPP灾备方案
  17. The development history and future trend of optical fiber communication technology
  18. ARP是什么?+ARP欺骗 MAC为ff:ff:ff:ff:ff:ff是什么意思
  19. 全球工业网络安全收入预计2028年达到244.7亿美元
  20. Java 多态实际操练--使用多态的特征创建不同宠物的玩耍方法

热门文章

  1. Jmeter(一)http接口添加header和cookie
  2. nodejs 复制、移动文件
  3. ListCtrl常用操作
  4. 【转】Web实现音频、视频通信
  5. SQL日期与时间函数
  6. 继承redis spring_Spring 极速集成注解 Redis 实践
  7. arch模型的思路_时间序列--ARCH模型
  8. dmg镜像如何写入u盘_手把手教你制作Linux系统安装U盘,小白都能轻松上手
  9. redis查看某一个key的大小_Redis笔记
  10. JAVA的cell设置行间距_iOS设置tableView的cell之间的间距