咨询个问题,码表的编号咱们一般是从0001,0002,0003开始的,可否使用1,2,3,4……这样排列下去?使用0001的好处在哪里?

1
已邀请:
3

BAO胖子 - 15年BI经验,涉足电力,快消品,医药,信息服务等行业的BI老兵。 2015-09-10 回答

0001这种风格的编码,优点很明显,就是看起来就像“代号”,比较酷。最明显的,就是James Bond, 007,是不是叫7号特工就显得比较low?
 书归正传,0001这种的一般被称为smart code, 也就是会包含一些含义在里面。
我们身边有好多这种例子,比如电话号码(国家号 区号 号码),邮政编码(省 市 区域),身份证号(省 市 区 生日 顺序码 校验码)。
这种Smart Code的优点之一就是,从Code本身我们就能读出很多信息,甚至很多程序员通过编码直接从Code里面获取数据。但有一个大前提,就是在预设编码规则时候,我们就要知道这对应的编码是恒久不变的,否则会带来巨大的麻烦。
 
这里有生动的例子,身份证号。不知道哪个脑残设计出来的身份证号的编码规则(当然身份证的设计者也是脑残,他不在今天的讨论范围之内),默认每个人的寿命不会超过100(或者数量微小可以忽略不计),这也就是从前15位身份证号的由来。而后加到了18位,又增加了一位校验码,注意哦,校验码中有字母”X“。15位的时候应该有不少人设计成LONG INTEGER类型的吧?加了一个X,改动就大多了。我真心不知道这设计坑了多少人。我也不知道在同一个区内,万一某一天出生的总人数超过100,那超出的人身份证号码怎么安排?

此外,这种设计是把身份证编码绑定在出生地的(当下是出生地,从前是16岁以后才可以办理身份证也就是16岁时的居住地),身份证号码对于每个个人是唯一的,我亲身经历过的事情之一,我大学同学江苏人,来辽宁读书时办理新身份证,他的身份证是按照我当时所在城市沈阳重新定义的,也就是说他一个人有两个身份证号。另外,我自己的经历,我是沈阳人,但已经来大连定居,虽然多身份证号码的事情已经被修正,我还保持从前的号码,即仍指向沈阳。也就是说,smart code所带来的信息有时会误导使用者,明明已经迁徙到另外的城市如果仍采用身份证编码来推算比如人口信息,将会得到错误的结果。

以上,smart code可以用,但要多考虑考虑未来的变化,即使未来变化了,也应该有预期的准备。
 
这里再谈到数据仓库,数仓是数据的搬运工,因此一般都不会选择smart code,采用如1,2,3,4这类surrogate key管理,至于surrogate key与natrual key之争又是另外的话题,不在讨论范围之内。
 
---- Update on 2015-09-15 -----
此处的更新是一定程度上纠正对于身份证号码“脑残”设计的误解。尽管我觉得会有更好的设计方式,但当初这种省 + 城市 + 区 + 生日 + 顺序码 + 校验码的方式是有历史原因的,当下身份证号的定义是在1984年,在30年前,IT的发展处于原始阶段,当时是不可能采用中心化统一顺序编码的模式来做这件事的,因为有大量居民需要申请身份证,这也是我们在计算机系统中遇到的多并发的问题,而采用share nothing的模式采用规则来保证各个派出所(我们可以理解成MPP中的节点)能够独立工作并且生成的身份证号与其他区的号码没有重复,这个可能就是当初设定这个编码规则的主要原因。这种规则可以有效的解决这个问题,当然也有了当下的各种问题。但就当时而言,也是不得已之举,并算不上太脑残的设计。
 
2

andrea_zhou - 咨询顾问、BA 2015-09-09 回答

编码,通常是会还有一些业务含义的。
你举例的是0001、0002,事实上很多编码都还不是这样子的。
譬如有件衣服,编码 2015030200098 ,这里面2015是说2015年的款,03是秋装,02是秋二波,00098是款号,、
这种情况下,意义就明显了,而且只能用字符型了。
除了编码,其实还有一类字段的,那是ID.
譬如表内ID,全局ID,不是用来展示,而是在后台用的,这些完全可以用INT型的。这些用来索引、JOIN会效率更好。
因此,在系统中,譬如维度表中,都可以同时存在
ID,编码,名称
再进一步,还可以同一个编码,同一个名称,不同的ID,这个用作渐变维。
总之,注意编码和ID。
0

牟瑞 - 大数据 Hadoop 讲师 Hadoop入门课程地址:http://www.hellobi.com/course/39 有架构师,技术总监,CTO的职位请联系我! 2015-09-09 回答

这样的好处是风格统一,在报表展示的时候不需要额外再进行处理,自动左右对齐!美观,大方。。。
0

pengyu1801 2015-09-09 回答

使用字符型规范编码方便扩展及排序,使用数字型索引快,如果编码没有特殊含义比如只是单纯的自增,可以优先使用数字。有些数据量大的表,查询速度要求高的话,可能会自建一些优化索引。不过整体来讲的话,大都还是使用规范编码吧
0

GeorgeYao - 路漫漫其修远兮,吾将上下而求索! 2015-09-09 回答

1.编码表中的编码一般讲究的是位数统一,例如:产品编码,长短有四位、六位、八位不等;
 故此就不能按照 1、2、3......这样去排序了;
2.按照1、2、3...... 这种风格去做编码表序列号或者编码也是不方便维护和管理
 
有点跑题,个人见解。

要回复问题请先登录注册