知识卡片

用ID代替文本实现规范化及其与文档模型的天然冲突

普通读书笔记卡

内容

为什么简历里的”地区”“行业”这类字段常用ID而不是直接存”Greater Seattle Area”这样的 文本字符串?用ID的好处很具体:多份记录之间样式和拼写统一、避免同名歧义、修改时只 需改一处存储该信息的地方就能全局生效(比如城市改名)、支持多语言本地化展示、以及 支持更精准的搜索(地区列表能编码”西雅图属于华盛顿州”这类事实,而”Greater Seattle Area”这个字符串本身看不出来)。这背后的核心原理是:用ID时,对人类有意义的信息只 存一处,所有引用的地方只存一个没有内在含义的ID;用文本时,这份有意义的信息会被 复制到每一处引用记录里。ID的关键优势在于它对人类没有意义、因此永远不需要改变——即使 它标识的信息未来发生变化,ID本身可以保持不动;但任何对人类有意义的东西未来都可能 需要修改,一旦这类信息被复制到多处,所有冗余副本都要跟着更新,这既带来额外的写入 开销,也带来”改了一部分、漏了另一部分”的不一致风险。消除这种重复正是数据库”规范化” 的核心思想。但规范化天然需要多对一关系(很多人住在同一地区、在同一行业工作),这 恰恰与文档模型不太吻合——关系数据库靠外键和连接来处理这种引用很自然,但文档数据库 对一对多之外的关系(多对一、多对多)支持通常很弱,如果数据库本身不支持连接,就必须 在应用程序代码里通过多次查询手动模拟连接,相当于把本该由数据库承担的工作转移到了 应用层。

参考来源

- 位置:《数据密集型应用系统设计》第二章《数据模型与查询语言》"多对一和多对多的 关系"(源文件:_epub-src/ch2_split_001.html) - 结论依据:原文列出用ID代替文本的五个好处(统一/避免歧义/易更新/本地化/更好搜索), 说明ID对人类无意义因而不需要改变、有意义信息重复会带来写入开销和不一致风险,并 指出规范化需要的多对一关系与文档模型对连接的弱支持天然冲突,直接支撑本卡片结论。 - 原始内容:使用ID的好处是,ID对人类没有任何意义,因而永远不需要改变……去除此类 重复是数据库规范化的关键思想……不幸的是,对这些数据进行规范化需要多对一的关系…… 这与文档模型不太吻合……在文档数据库中,一对多树结构没有必要用连接,对连接的支持 通常很弱。