一门把人吓跑的数据库课,终于有人开始“去神秘化”

如果你学过数据库设计,大概率在第三范式、BCNF、第四范式那一段还勉强能跟上,可一到第五范式,很多人的表情都会迅速切换成“老师你先讲,我去接杯水”。这并不完全是学生的问题。

最近,数据库设计作者 Alexey Makhotkin 发布了一篇长文,主题直指 5NF——也就是第五范式。他的态度很直接:过去很多教材、文章乃至维基百科对 5NF 的讲法,不只是难,而且是“人为制造的难”。这篇文章最有价值的地方,不在于又发明了一个新定义,而在于它试图把问题拉回一个朴素常识:数据库不是拿来考逻辑谜语的,它首先是服务业务的。

这件事为什么重要?因为数据库教育里有一种顽固传统:喜欢从一张表开始,问你“这张表可能表示什么”,再硬拆成两三张表,最后宣布“恭喜,这就是更高范式”。这种教学对考试可能有帮助,对真实工作却常常有害。现实中的表结构,很少是凭空从 Excel 里长出来的;它们通常来自订单、库存、演出安排、用户关系、支付链路这些具体业务。离开业务语义谈范式,最后往往只剩下术语体操。

维基百科那个经典例子,为什么总让人觉得不对劲

Makhotkin 把矛头对准了一个很多人熟悉的 5NF 例子:推销员、品牌、产品类型。表面上看,这个例子很正规,三个维度,三列数据,再加上一条绕来绕去的规则:如果某个推销员卖某些品牌,也卖某类产品,那么只要这些品牌生产该类产品,他就“必须”卖这些品牌的该类产品。

问题恰恰出在这个“必须”上。它像是为了配合范式定义而编出来的商业世界。现实中,销售不卖某个品牌的某个品类,原因可能太多了:区域代理限制、返点政策、库存问题、渠道冲突,甚至只是老板一句话。你很难想象一个正常公司会规定:你一旦卖了某品牌的面包盒,又开始卖别家吸尘器,那你就必须连这个品牌的吸尘器也一起卖。这个世界不是数据库论文,业务规则也不会为了证明分解是无损的而存在。

这也是为什么很多开发者第一次接触 5NF 时,会本能地觉得“哪里怪怪的”。不是你理解力差,而是例子本身就不够像现实。文章里有一句很扎心的潜台词:如果一个范式必须依赖高度做作的规则才能讲清,那问题未必出在范式本身,可能出在教学方法。

从媒体视角看,这种反思其实很有代表性。今天不少技术领域都在经历类似纠偏:机器学习课程在反思公式堆砌,编程教育在反思“刷题即能力”,数据库领域则在反思“范式神学”。技术教育如果不能解释“为什么这样设计对业务更好”,最终只会把初学者训练成能背概念、不会建系统的人。

真正该先做的,不是拆表,而是把业务说清楚

这篇文章给出的替代方案相当务实:先做逻辑模型,再落地物理表结构。说白了,先搞明白现实世界里到底有哪些“东西”和“关系”,再谈数据库该怎么存。

作者把 5NF 常见场景归纳成两个结构模式。一个是 AB-BC-AC 的“三角形”,另一个是 ABC+D 的“星形”。这听起来有点像高中几何题,但背后其实是很工程化的思维:你不是在追逐某个神秘范式,而是在识别业务里到底是哪些实体彼此有关联,这些关联是多对多,还是一对多,是否需要单独成为一个可追踪的对象。

文章里最容易让人一下子明白的,是冰淇淋例子。品牌、口味、朋友,三个实体。品牌和口味之间有关系:某品牌生产哪些口味;朋友和品牌之间有关系:某人喜欢哪些品牌;朋友和口味之间也有关系:某人喜欢哪些口味。于是,你自然会得到三张连接表,而不是先捏造一张三列大表,再费劲解释为什么要拆。

这就是好建模和坏建模的区别。坏建模喜欢把结果先拍在桌上,再让你猜原因;好建模则是从业务语言出发,一步步推到表结构。前者像魔术,后者像工程。对于今天大量使用 ORM、低代码平台、数据中台甚至 AI 自动生成 SQL 的团队来说,这种“先逻辑后物理”的训练反而比死记范式名字更重要。因为工具会越来越自动化,但业务抽象永远不能外包。

从冰淇淋到音乐会,5NF 真正碰到的是“关系的关系”

如果说冰淇淋是个友好的入门例子,那么音乐会案例就更接近企业系统的真实复杂度。作者引用了另一个经典场景:音乐家、乐器、音乐会,以及新增出来的“演出记录”或“表演”这个对象。

这一步很关键。很多人会习惯说:“某个音乐家在某场音乐会上演奏了某种乐器。”这句话在自然语言里没毛病,但一落到数据库里就容易含混,因为它一次性扯进了三个实体。作者坚持一个很朴素的原则:关系最好先拆成清晰的二元链接。于是,“表演”被提升为一个独立实体——一场音乐会由多次表演构成,每次表演对应一个音乐家和一种乐器。

你会发现,这和很多现实系统的演进轨迹非常像。刚开始团队总觉得“三张表够了”,等业务长出计费、审计、补贴、排班、权限、历史版本之后,才发现中间那个“动作”本身其实才是最核心的数据对象。外卖系统里,真正关键的不是用户和商家,而是订单;物流系统里,不是仓库和商品,而是出入库记录;SaaS 里也常常不是员工和项目,而是一次次工时填报、审批流转。数据库设计最容易犯的错,就是把“事件”误当成“关系备注”。

从这个角度看,5NF 的价值并不是告诉你某张表必须再分裂一次,而是提醒你:当你觉得一个三元关系很别扭时,可能不是范式在作怪,而是你漏掉了一个应该被命名、被追踪、被赋予主键的业务实体。

今天重新讨论 5NF,不只是学术洁癖,而是系统复杂度真的回来了

为什么在 2026 年,这样一篇讨论数据库范式的文章仍然值得看?因为我们正处在一个很微妙的技术周期里:一方面,NoSQL、文档数据库、事件流、Lakehouse 这些年不断削弱“传统关系数据库课程”的存在感;另一方面,企业核心系统在绕了一圈之后,又重新面对一致性、可审计、跨系统对账、复杂权限这些老问题。最后兜兜转转,大家还是得回到那个并不性感但极其重要的话题:数据到底该怎么建模。

尤其是 AI 编程工具流行之后,一个新风险也变得越来越现实。Copilot、ChatGPT 一类工具很擅长根据表面需求快速生成 schema,但它们也很容易把模糊的业务描述直接固化成看似合理、实际脆弱的表结构。短期内它能帮你省一天,长期可能让你多背一年技术债。5NF 这类概念的现实意义,正在从“考试知识点”变成“识别 AI 生成设计是否靠谱的底层素养”。

当然,我也不认为范式讨论可以完全被“业务优先”取代。过于强调业务直觉,也可能让一些团队掉进另一种坑:因为需求当前看起来简单,就拒绝抽象和分解,最后把一切塞进 JSON 字段,或者用一张超级宽表硬撑。那种设计上线快,返工也快。真正成熟的工程判断,不是迷信 5NF,也不是嫌它麻烦就彻底绕开,而是知道什么时候该把复杂关系拉平,什么时候该承认世界本来就复杂。

Makhotkin 文章最后的结论其实挺克制:你未必需要把“第五范式”这个标签挂在嘴边,照样能设计出规范、无冗余、少异常的表结构。这个判断我基本同意。对大多数工程团队来说,最好的数据库教育不是把 5NF 讲得像黑魔法,而是让人形成一种稳定习惯——从业务出发,识别实体,识别关系,检查基数,必要时把“事件”独立出来。做到这一步,5NF 常常就已经被你“顺手完成”了。

某种程度上,这也是技术行业一个让人欣慰的变化:我们终于开始接受,真正高级的知识,不应该通过制造恐惧来证明自己高级。把复杂问题讲清楚,不会降低专业门槛,反而更能暴露谁是真的理解了系统,谁只是在背定义。数据库世界里那头叫 5NF 的怪兽,也许从来没那么可怕;可怕的是,我们曾经习惯了用故作高深的方式教它。