改漏一列的代價不是工多,是資料安靜地不一致
「同一個事實存在很多列,改的時候要改很多次」——這只是麻煩。真正的代價是改漏了系統不會告訴你。
一萬列裡漏掉三列,資料庫照樣接受:型別對、約束過、沒有任何錯誤。從此「阿寶」和「阿保」同時存在,之後誰也說不清哪個才對。
- 工多是累,改漏是壞掉,而且是安靜地壞——沒有 exception、沒有紅燈,通常是好幾個月後有人對報表才發現。
- 批次更新做到一半失敗更糟:一部分列改了、一部分沒改,資料庫留在一個沒有任何人設計過的中間狀態。
這就是正規化要買的保險:把一個事實只存一份,那它就沒有「改漏」這個失敗模式可言。三個 NF 的判準見 正規化的三個階段是同一個問句的三種問法。
反過來說,這也是反正規化真正的代價——省下來的查詢時間可以用硬體買回來,資料不一致不行,見 拆表把成本集中在一次 join,不拆表把成本攤到每一列。