编码设计的原则与平衡

从D-U-N-S编码到身份证号,深入探讨编码设计的唯一性、可读性与扩展性平衡原则。

D-U-N-S 用 9 位数标识了全球几亿家企业,中国身份证用 18 位数标识了 14 亿人。同样是在"给事物编号",设计思路为何天差地别?企业 SKU 只有几千个,却常常用十几位——问题出在哪里?

一、引子

凡事皆需编号:商品要有 SKU,员工要有工号,订单要有单号,客户要有客户号。但"编号"这件事,看起来简单,做起来容易走两个极端:

  • 极端一:纯序号,但短到毫无信息量
  • 极端二:塞满语义,但长到难以记忆和录入

D-U-N-S 和身份证恰好代表了这两个极端。而绝大多数企业的 SKU,则是在两个极端之间摇摆不定——结果往往既不够短,也不够有意义。

二、两个极端

极端一:D-U-N-S——纯序号的最小化

D-U-N-S(Data Universal Numbering System)是 Dun & Bradstreet 公司为全球企业分配的 9 位唯一标识符。

字段 | 位数

--- | ---

序号 | 8

校验位 | 1

**合计** | **9**

核心设计理念:号码就是一个钥匙,所有信息都在数据库里

编码 duns.png

优点:

  • 最短:9 位覆盖 1 亿个企业(实际仅需约 4 亿),完全够用
  • 最简:纯数字,零编码规则,不会因为业务变化而需要修改号码规则
  • 最稳:不需要任何改造,加一位就能扩容 10 倍

代价:

  • 离线无意义:看到一个 D-U-N-S 号码,你完全不知道这家公司做什么、在哪里
  • 高度依赖数据库:想知道任何信息,必须查库

极端二:中国身份证——语义编码的最大化

中国公民身份证号码 18 位,是语义编码的典型代表。

字段 | 位数 | 有效信息量

--- | --- | ---

行政区划代码 | 6 | ~3,000 种地区

出生日期(YYYYMMDD) | 8 | 365天 × 100年 ≈ 36,500

顺序码 | 3 | 999 人/日/区(含性别)

校验码 | 1 | 校验

**合计** | **18** | **有效编码容量约 10^17**

核心设计理念:号码本身就是一份微型档案

idcard-semantic.png

优点:

  • 强自描述:只看号码就能知道籍贯、出生年份、性别
  • 离线可用:警察查身份证不用联网,就能判断是否合理
  • 强校验:18 位的校验算法可检测所有单位数错误和绝大部分调位错误

代价:

  • :18 位数字,录错概率远高于 9 位
  • 刚性结构:行政区划调整(撤县设区、城市合并)会导致号码不再代表实际意义
  • 容量浪费:14 亿人用 10^17 的空间,利用率万分之一不到

两个极端的对比

维度 | D-U-N-S(纯序号) | 身份证(语义)

--- | --- | ---

位数 | 9 | 18

理论容量 | 10^8 | ~10^17

实际覆盖率 | ~40% | ~0.001%

离线可读性 | ❌ | ✅

数据库依赖 | 强 | 弱

扩容成本 | 低(加一位) | 极高(格式固定)

场景 | 企业纯索引 | 公民强防伪+离线识别

两种设计都没有错,它们的差异来源于根本的场景需求不同。D&B 拥有全球企业数据库,企业之间也不需要"看号识人";而身份证必须在无网络的环境下被公安、银行等机构快速检验。

三、企业 SKU 的困境

回到企业 SKU 的问题上来。

国内很多企业只有几千个 SKU,却用了 12-15 位编码——有的甚至用字母+数字混编。为什么?

常见原因:

  1. 部门接力:产品部编品类码 → 采购部加供应商码 → 仓储加库位码 → 运营加季节码。每加一段,没人敢删旧的。
  2. "以防万一"综合征:现在只有 3 个品类,但预留了 3 位(够 999 个);只有 10 家供应商,但预留了 3 位(够 999 家)。
  3. 历史包袱:ERP 换过三次,每次加一位前缀标识数据来源。没人敢清理。
  4. 无顶层设计:没有人对"编号体系"整体负责。各做各的,层层叠加。

结果就是:一个既不能像 D-U-N-S 那么短,又不能像身份证那样真正读得出信息的"驼子"

四、平衡之道:编码设计六原则

好的编码设计,需要在六个维度上找到平衡。

原则一:唯一性(最底层)

编号的首要使命。必须保证不重复。

  • 集中发号 vs 组合字段发号
  • 自增序号 vs 雪花算法 vs UUID

原则二:简洁性(最直接)

越短,录入错误越少,存储和传输成本越低。

  • 每减少 1 位,误码率下降约 10%
  • 每减少 1 位,千亿级数据存储节省数百 GB

原则三:可读性(最有争议)

该不该让号码"本身有意义"?

  • 纯序号:机器友好,人记不住
  • 语义编码:人友好,但容易扩不动

原则四:可扩展性(最容易被忽视)

今天的编码,三年后还够用吗?

  • 纯序号:加一位即可
  • 语义编码:每个字段都可能成为瓶颈

原则五:稳定性(最贵重的)

编码规则一旦确定,最好永不更改。改编码方案的代价几乎等于换一套 ERP。

原则六:校验性(成本最低的保险)

在编码中加入校验算法,用极小的成本拦住绝大多数录入错误。

  • 身份证的 ISO 7064:1983, MOD 11-2
  • Luhn 算法(信用卡号)
  • D-U-N-S 的专有校验

五、如何为 SKU 找到平衡点

不同规模的企业,平衡点不同。

小规模(<1000 SKU)

推荐:4-6 位纯数字号 + 1 位校验

0000C ~ 9999C
  • 10000 个组合,覆盖 1000 SKU 绰绰有余
  • 纯数字手输快,校验位防错
  • 每年加个几百个 SKU,十年也用不完

中规模(1000~50000 SKU)

推荐:2 位品类缩写 + 6 位序号 + 1 位校验

EL-004205-C
(电子产品 - 第 4205 号)
  • 只有一段语义,未来品类增减不影响序号层
  • 品类用字母而非数字,一眼可区分
  • 品类码固定 2 位,用完加 1 位即可(EL→ELE)
  • 序号层 6 位 = 100 万,中规模企业很难用完

大规模(50000+ SKU)

推荐:纯 8-10 位序号 + 1 位校验,完全交给数据库

04205817C
  • 当 SKU 数量大到一定程度,语义编码的人读优势递减
  • 没有人能记住 5 万种商品的编码规则
  • 全部交给数据库和扫码枪,最短即最优

六、还有几个经验之谈

  1. 别用字母编码业务含义,除非你确认它永远不变
    今天编 A=服装, B=食品,三年后跨境业务来了,CZ 都不够用。不如让字母在序号段里自然增长。
  2. 永远保留 1 位预留位
    设计时在末尾放一个 0,告诉所有人:这位置是留给未来的。到真要扩容那天,变成 0-9 即可。
  3. 不要用 UUID 做对外编号
    550e8400-e29b-41d4-a716-446655440000 虽然后端很方便,但无论是录入、报修还是客服沟通,都是噩梦。内部用 UUID 关联,外部永远转成短编码。
  4. 校验位不贵,值得每位编码都配上
    一位校验位几乎不增加存储成本,但能堵住约 90% 的手动录入错误。

七、小结

设计方案 | 适合场景 | 典型位数

--- | --- | ---

纯序号 + 校验 | 大规模、高频次、扫码为主 | 6-10

单语义段 + 序号 + 校验 | 中规模,人为介入较多 | 8-12

纯语义编码 | 防伪、离线验证、强识别需求 | 15-18

多层语义编码 | ❌ 不推荐,除非有明确法规约束 | 12-15

回到最初的问题——为什么 D-U-N-S 能用 9 位覆盖全世界,而企业 SKU 只有几千个却用十几位?

答案不是"D&B 技术更好",而是:

D-U-N-S 知道自己只是把钥匙,所有信息都在数据库里。 身份证知道自己是一份微型档案,要在离线场景下自证明。 而大多数企业 SKU,既没想清楚自己是钥匙还是档案,也没有人真的对编码体系负责。

编码设计的本质,是在简洁性自描述性之间找到适合自己场景的平衡点。这两种需求没有优劣,但你不做选择,最终就会被历史惯性替你选——而那通常是最坏的结果。

*作者:喜乐君* *唯有知识让我们免于平庸*

作者:xilejun · v1.0 · 2026-05-22

📖 相关文章
风控触发规则仪表板设计案例
金蝶云星空 — 采购业务主题与数据表速查 1.1
[航空] 旅客航司权限控制:两种方法对比与最佳实践
业务对象及其到数据的映射:不要把「航班号」拆成两半
折腾"龙虾"的人,20年前就"命中注定"了
——————————————————————————————

No comments yet