命名系统(1):名字是怎么被造出来的
两年前我给一批设备做资产台账,卡在一个很具体的问题上:同一台电机,采购单上叫「三相异步电动机 Y2 132M 4」,仓库标签写「电机 7.5kW」,维修记录里是「3# 线主驱」。三个名字,指的是同一个东西,但没有一个能在系统之间直接对上。
命名系统(1):名字是怎么被造出来的
两年前我给一批设备做资产台账,卡在一个很具体的问题上:同一台电机,采购单上叫「三相异步电动机 Y2-132M-4」,仓库标签写「电机 7.5kW」,维修记录里是「3# 线主驱」。三个名字,指的是同一个东西,但没有一个能在系统之间直接对上。
那次之后我开始留意各行各业的命名规则。发现它们解决的是同一类问题——如何用一串符号,唯一、稳定、可扩展地指代一个事物——只是解法不同。这个专栏就是把这些解法摊开来看。
第一篇不谈具体行业,先讲清楚名字是怎么被造出来的。后面六篇再分领域拆。
一、命名的四条硬约束
任何一套命名系统,都在同时满足四件事:
| 约束 | 含义 | 违反的后果 |
|---|---|---|
| 唯一性 | 一物一名,一名一物 | 检索歧义,数据对不上 |
| 稳定性 | 对象不变,名字就不变 | 历史数据断链,改一次牵一片 |
| 可校验 | 人能写错,机器要能查出来 | 错号混进系统,静默污染 |
| 可扩展 | 新事物有位置可放 | 用几年就撞墙,被迫重构 |
大多数命名系统的缺陷,不是设计得不好,而是这四条里必然要牺牲一两条,设计者没想清楚牺牲的是哪条。
二、六种生成机制
按符号的生成方式分,能落到六类。这是本专栏的分析框架。
| 机制 | 名字怎么来 | 优点 | 代价 | 代表 |
|---|---|---|---|---|
| 语法生成式 | 按语法规则从构成推出唯一合法名 | 信息完整、可反推结构 | 名字长、规则难学 | IUPAC 化学命名、SI 单位、VIN |
| 层级编码式 | 大类/中类/小类逐级用数位展开 | 便于统计汇总、能逐层下钻 | 边界对象无处安放 | HS 编码、ICD、GB/T 4754 |
| 登记流水式 | 权威机构发号,号码无内在语义 | 永久稳定、绝不重复 | 零可读性、依赖中心机构 | CAS 号、ISBN、DOI、LEI |
| 助记约定式 | 从词里取缩写,靠约定维持唯一 | 好记好念、传播成本低 | 容易撞名、无规则可校验 | IATA 三字码、基因符号、Pantone |
| 型号规格式 | 关键参数直接写进型号 | 看一眼就懂规格 | 参数一变就得换名 | 轴承 6205、钢 Q235B、螺纹 M8×1.25 |
| 版本演进式 | 用位段表达兼容性变化 | 机器可判断兼容性 | 只适用于有版本序列的对象 | SemVer |
这六类不是互斥的。成熟的体系往往是组合拳:GS1 的商品条码是「层级 + 流水 + 校验位」,药品 INN 是「语法生成 + 词干约定」。
三、语义和稳定,天生打架
把六种机制排在一条轴上,左端是「名字里装满信息」,右端是「名字里什么信息都没有」:
纯语义 ←──────────────────────────────────→ 纯流水
Q235B 6205-2RS ICD-11 ISBN-13 CAS 321-21-1
好读 ↑ 有校验 永久但不可读
参数变则名变 中间地带 永不复用
- 越靠左,人越好读,但对象一旦变化(材料改进、规格调整),名字就得作废,历史数据跟着断。
- 越靠右,越稳定,但没人能靠名字知道它是什么,必须查表。
所以真正的行业惯例是双轨制:一个给人看的语义名,加一个给机器用的永久号。
药品是最典型的例子——医生写「阿托伐他汀钙」,药房系统里走的是 ATC 编码 C10AA05 和药品本位码;论文里写 INN,专利里写 CAS 号。四套并行,各管一段。
四、三个拆解,看清机制怎么落地
1. IUPAC:语法树的极致
2,2-二甲基丙烷 这个名字是可以「算」出来的:
- 母体
丙烷:三个碳的直链 - 取代基
甲基:一个碳的支链,出现在 2 号位,且有两个 - 定位数
2,2-:告诉你在第几个碳上
反过来,给定结构式,任何人按同一套规则推导,都会得到同一个名字。这是语法生成式的理想状态:命名不需要权威机构,只需要规则。
代价是长度。一个中等复杂度的天然产物,系统名可以长到三行。所以实践中没人拿 IUPAC 名当数据库主键,全世界的化学数据库都用 CAS 号或 InChIKey 做索引。
2. 轴承 6205-2RS:型号即参数表
拆开看:
| 段 | 值 | 含义 |
|---|---|---|
| 类型 | 6 | 深沟球轴承 |
| 尺寸系列 | 2 | 轻系列(宽度与直径系列组合) |
| 内径 | 05 | 内径 = 5 × 5 = 25 mm |
| 后缀 | 2RS | 两侧橡胶密封 |
内径编码有个例外要记住:00 = 10 mm,01 = 12 mm,02 = 15 mm,03 = 17 mm,从 04 起才是「末两位 × 5」。
这类编码的前提是参数空间有限且组合受约束。轴承的类型、尺寸系列、内径都是离散枚举,所以能塞进一个短型号。一旦换成非标件,这套编码立刻失效,只能走图号。
3. ISBN-13:校验位怎么算
书号是「层级 + 流水 + 校验」的混合体。978 是图书前缀,7 是中文组区,后面是出版者和书名号,最后一位是校验位。
校验算法:前 12 位从左到右,奇数位权重 1、偶数位权重 3,求和后取 (10 - sum % 10) % 10。
以 978-0-306-40615-7 为例:
def isbn13_check(first12: str) -> int:
total = 0
for i, ch in enumerate(first12):
total += int(ch) * (1 if i % 2 == 0 else 3)
return (10 - total % 10) % 10
print(isbn13_check("978030640615")) # 7
9×1 + 7×3 + 8×1 + 0×3 + 3×1 + 0×3 + 6×1 + 4×3 + 0×1 + 6×3 + 1×1 + 5×3 = 93,校验位 (10-3)%10 = 7,与末位一致。
校验位只花掉一位容量,换来的是:任何单字符输错、相邻两位对调,都能被查出来。这就是为什么所有需要人工录入的编号——身份证、VIN、IBAN、IMEI——几乎都带校验位。
五、自己设计一套编码时,先回答六个问题
- 谁发号? 中心机构发号(稳定但慢)还是规则自生成(快但可能撞名)。
- 语义放多少? 放进去好读,但改动即断链。通常只放「不会变」的属性。
- 要不要校验位? 只要有人工录入环节,答案就是「要」。
- 位数预留够不够? HS 留了 6 位国际段给各国扩展,行政区划 6 位留到乡镇扩 9 位。设计时就要想好往哪长。
- 和外部体系怎么映射? 你的内部编码迟早要和行业标准对接,映射表要提前留。
- 废弃号怎么处理? 正确做法是永不复用——作废的号留空,否则历史单据会指向错误对象。
六、专栏目录
- (一)总纲与机制:本篇
- (二)自然科学:IUPAC、双名法、星表、台风命名
- (三)医药健康:INN 词干系统、ATC、ICD、LOINC、UDI
- (四)工业制造:轴承螺纹、材料牌号、电子器件、建筑分部
- (五)商贸与金融:GS1 条码、HS 税则、行业分类、ISIN 与 LEI
- (六)交通与地理:机场三字码、IMO 号、VIN、行政区划代码
- (七)知识与文化:ISBN 与中图法、作品号、色号、食品编码、SemVer
下一篇从化学开始——那是人类把「命名」这件事做得最彻底的地方。