在系统设计时,经常会出现id,code的属性。这个标准是什么,如何使用,有规律吗?
譬如 下面举个例子仓库,有三个字段,用JSON表达如下
{id:5code:"SH01"n(有哪些以lia开头的四字成语?没有lia字开头的成语,QQ接龙红包“一个顶俩”难倒了不少网友,根据成语词典提示,成语中含有俩(lia)的成语有:鬼蜮伎俩、鬼魅伎俩、有三有俩、鬼蜮技俩、一个顶俩。可是,按照规定,必须是俩(lia)开头的成语才可以。但是并没有俩(lia)开头的成语,所以这是一个无解的成语接龙呢。)ame:"上海昆山仓库"}
现在要建一个库存表,这时库存表里应该设计为增加仓库ID,还是仓库code?
本文结合自己的一些经验,归纳终结一下啊。有不同意见的,欢迎讨论。
分析特性生成方式id 系统底层自动生成。一般是采用数据库自增和雪花算法,或者其他的变种。
而code的生成方式一般是手动输入,也有可能是业务层根据特定上下文维度来生成(譬如条码code = 款号code+颜色code+尺码code)
正因为id时底层内部行为,在创建时是无法指定或者推断的。而code是在外部确定传给该系统的。在分布式系统中通过这个code进行幂等性校验就天生的自然,并容易形成共识和规范。
数据类型id的类型一般是整型或者长整形。并且大都是具备顺序行,或者类似顺序性。查询速度应该比较快,TODO testing
code的类型一般是字符串。因为字符串的字面量的表现力时int无法比拟的。所以String类型的兼容性比id的int要好很多。你的系统的类型是可以确定的,但是你的数据来源有可能来源于外部的其他系统,这个时候使用String类型的code是个明智选择。
长度id一般都非常长,使用上非常不方便。code 相对非常短。并且一般是有固定长度设定。方便对齐,沟通
可变性id肯定是不可变的,一旦产生终身跟随,不可修改。
code也应该遵守这个规则。一定不可变。
大多数情况code也是如此,但是也有例外譬如user的code用什么,如果没有用户在注册时都输入了身份证,这个code就很完美,并且永远唯一。但是现实中这个是不现实的。如果可以用手机号码作为code吗,看上去可以。系统各处,系统间都用手机号码来标识用户,用于一旦换手机号码,历史数据就是个大坑。这种情况user就不能用手机号码来作为code。那该用那个字段作为code, 我的理解是没有。如果我们认定一个user是一个自然人,在我们系统没有任何确定的code来标识一个自然人,这个code就没法确定。
具备含义和功能id是无意义的,当然一般具备一定的顺序性。
而code 时非常具备业务含义的,人看到code就会立即知道他们在具体指哪个东西。可用于交流沟通,文档存储,协议定义。外部系统通过这个code来标识具体要操作那个实体,进行系统间交互。
同时code可以增加校验位,拆解规则等来附带更多信息和功能。
业务稳定性code具备非常好的业务稳定性,譬如对于外部系统上海昆山仓库编号无论系统如何改造,存储机制时什么,仓库编号都是固定和稳定的,都是SH01。
而id就不是这样。注意id是内部实现细节。
结论在当前实体的设计时,要尽最大可能性的寻找到那个或者哪些字段可以逻辑上标识一个对象,重要的一点是一定是不可变的。如果有就定义这个字段为code, 或者这些字段计算或拼接产生出一个code。
并且其他实体对实体的关联都使用这个code,而不是id。与其他系统的API也使用code。为什么?因为code具备稳定性,有意义,方便沟通,可预先定义等优点。把这个id作为一个系统内部的实现隐藏起来。
例如库存表的就使用warehouse_code,而不是warehouse_id
如果实在找不到一个不可变的code。就退而求齐是。使用这个id
譬如user表没有code,只有userId, 并且其他系统也通过该userid进行沟通
BTW, 这里的code是个广义上的code,而不是说属性的名就是code, 建议在业务系统自定义个annotation(譬如@Code)来标识那个属性是code。