业务实践系列(1):ID号(订单ID,用户ID)设计思路分析
项目中对订单号进行重新设计,参考了网上的方案加上自己的思路,根据不同的业务场景进行分析。
订单号
订单号:是给订单一个唯一的标识,通过该订单号,可以查询该订单的信息,主要是给用户、客服、后台管理等使用。
订单号设计:首先明确,所有的设计和规则都应是为业务服务而制定的;方案应适用于当前业务规模、业务类型或适应市场需求。
设计要求
订单号的设计都会有一个基本的要求。
唯一性
不允许存在重复的可能性发生;要防止并发的情况。安全性
外部人员无法从订单号推测出业务相关的信息,如自增订单号可知订单量。精简可读
精简可读是为了能方便汇报、输入和记录。
订单号尽可能简短,当然这是相对的,随着业务量增大,适当增加长度也是可以的;
最好使用数字,不要使用连接符,杜绝包含特殊符号。
组成要素
订单号通常由以下几种元素的编号组成,根据场景需要进行组合; 或只取出编号中的某几位用于组合成订单号。
- 数据库主键自增的值
利用数据库主键自增的值,适用于内部使用小系统;对外开放使用的系统不建议使用。 - 类型编号
主要是与业务相关的编号。
如:业务类型编号、产品类型编号、平台类型编号、终端类型编号、渠道类型编号、仓库类型编号、区域编号等。 - 时间信息
如:年月日时分秒、时间毫秒值、时间戳等。 - 随机数
如:按需生成固度长度的随机数,常用3到6位。 - 商家ID
如:订单号包含了商家编号中的某几位。 - 用户ID
如:如淘宝订单号,后6位为用户ID的某几位数字(2018年的订单号)。
开发设计
- 如果订单表存储使用了分表分库,那订单号的某几位数字用作分库分表规则。
- 如果还考虑分布式部署,其中一两位可用来标识系统部署的路由规则。
使用专门生成订单ID的服务器,如果业务量大时,服务器部署在多台主机上,需要预留位数作为机器ID的标识。 - 可先预预估订单量,提前生成订单ID并存储,使用时直接来拿,做一个监控,当剩余订单号小于某个值时就再次批量生成。
现项目更改后的订单ID共18位: 3位业务类型编号+10位精确到秒的时间戳+3位用户ID+2位随机数
相关参考
业务实践系列(1):ID号(订单ID,用户ID)设计思路分析
http://blog.gxitsky.com/2018/03/07/Business-01-orderId-design/