专栏首页Java全栈优雅的数据库表ID的设计方案

优雅的数据库表ID的设计方案

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【译】设计优雅的 Rust 库 API

    原文见:https://deterministic.space/elegant-apis-in-rust.html

    MikeLoveRust
  • Mysql实例 数据库优化--数据库表设计

    现如今,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显,所以要重视数据库的性能优化。

    陈不成i
  • 数据库同步设计方案

    需求 目前我们公司开发的系统大部分都涉及到数据传输,简单的系统架构如下,有企业输入单证信息,提交到政府机关进行审批,将审批的结果返回到企业端,由于企业客户端系...

    阿新
  • 如何优雅的设计数据导出功能?

    对于一些报表性的后台,有些会提供数据导出功能。如果查询维度过多又都是耗时操作,那就像是开了潘多拉盒子,会造成比较恶劣的后果。

    Criss@陈磊
  • 常用的数据库应用设计优化方法

    vincehuang
  • 拖拽数据库设计方案小结

    对于公告或者菜单或者帖子通常会有拖拽排序的需求,这个时候数据库设计呢。本文就来简述一下几个方案。

    codecraft
  • 基于.Net + SqlServer的分库分表设计方案

    在说分库分表之前,先简单介绍下网站架构,这样有助于理解为何需要分库分表这种技术。因为所有的技术,大多都是因为业务的需要而产生的.

    郑小超.
  • 架构设计之「数据库集群方案」

    在之前的文章中,我们知道数据库服务可能已经成为了很多系统的性能关键点,甚至是瓶颈了。也给大家介绍了数据库服务器从主备架构、到主从架构、再到主主架构的基础方案。但...

    Bug开发工程师
  • 架构设计之「数据库集群方案」

    在之前的文章中,我们知道数据库服务可能已经成为了很多系统的性能关键点,甚至是瓶颈了。也给大家介绍了数据库服务器从主备架构、到主从架构、再到主主架构的基础方案。但...

    奎哥
  • SaaS-多租户SaaS平台的数据库方案(数据库设计与建模)

    反三范式是基于第三范式所调整的,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。

    cwl_java
  • Echo的数据库表是如何设计的

    这个表应该是相对来说最复杂的一张了。因为不仅有评论(对帖子的评论),还有对评论的回复,都放在这一张表里面了。

    飞天小牛肉
  • 如何优雅的将数据库表逆向生成代码

    作为 Java 开发,数据库操作是不可逃避的问题,最原始的方式可能使用JDBC操作数据库。渐渐的有了对象关系映射的框架。最让人熟知的有 Hibernate、My...

    不安分的猿人
  • SAP数据库表DDLOG的设计原理

    Today when I am reading this SAP help, I find out this sentence:

    Jerry Wang
  • MySQL性能优化(二):优化数据库的设计

    数据库编码: 尽量采用utf8mb4而不使用utf8。MySQL 的“utf8”实际上不是真正的UTF-8,真正的UTF-8是每个字符最多四个字节,而MySQ...

    码农架构
  • Python 中更优雅的环境变量设置方案

    在运行一个项目的时候,我们经常会遇到设置不同环境的需求,如设置是开发环境、测试环境还是生产环境,或者在某些设置里面可能还需要设置一些变量开关,如设置调试开关、日...

    崔庆才
  • 分库分表后全局id的生成解决方案

    分库分表后每个表还都从1开始累加肯定有问题,需要全局唯一id的生成器,下面详解各种方案优缺点。

    JavaEdge
  • 数据库表设计对性能的影响

    很多人看来,数据库Schema设计是一件非常简单的事情,大体按照系统设计时候的相关实体对象对应成一个一个表格就可以了。为了在功能上尽可能容易扩展,根据数据库范式...

    dys
  • SAP CRM数据库表CRMD_CUMULAT_H的设计原理

    Recently I am working in a project and the prerequisite is to understand how tab...

    Jerry Wang
  • Salesforce和SAP Netweaver里数据库表的元数据设计

    从Salesforce官网可以了解到Salesforce的force.com平台里数据库表的设计:https://developer.salesforce.co...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券