专栏 命名系统

命名系统(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——几乎都带校验位。

五、自己设计一套编码时,先回答六个问题

  1. 谁发号? 中心机构发号(稳定但慢)还是规则自生成(快但可能撞名)。
  2. 语义放多少? 放进去好读,但改动即断链。通常只放「不会变」的属性。
  3. 要不要校验位? 只要有人工录入环节,答案就是「要」。
  4. 位数预留够不够? HS 留了 6 位国际段给各国扩展,行政区划 6 位留到乡镇扩 9 位。设计时就要想好往哪长。
  5. 和外部体系怎么映射? 你的内部编码迟早要和行业标准对接,映射表要提前留。
  6. 废弃号怎么处理? 正确做法是永不复用——作废的号留空,否则历史单据会指向错误对象。

六、专栏目录

  • (一)总纲与机制:本篇
  • (二)自然科学:IUPAC、双名法、星表、台风命名
  • (三)医药健康:INN 词干系统、ATC、ICD、LOINC、UDI
  • (四)工业制造:轴承螺纹、材料牌号、电子器件、建筑分部
  • (五)商贸与金融:GS1 条码、HS 税则、行业分类、ISIN 与 LEI
  • (六)交通与地理:机场三字码、IMO 号、VIN、行政区划代码
  • (七)知识与文化:ISBN 与中图法、作品号、色号、食品编码、SemVer

下一篇从化学开始——那是人类把「命名」这件事做得最彻底的地方。

说明 · 本站内容均为学习笔记与经验总结,所有菜谱与技法请结合实际食材、季节与个人口味灵活调整。涉及生食、营养与健康的内容仅供参考,特殊体质或疾病请咨询专业营养师/医生。