改漏一列的代價不是工多,是資料安靜地不一致

「同一個事實存在很多列,改的時候要改很多次」——這只是麻煩。真正的代價是改漏了系統不會告訴你。

一萬列裡漏掉三列,資料庫照樣接受:型別對、約束過、沒有任何錯誤。從此「阿寶」和「阿保」同時存在,之後誰也說不清哪個才對。

  • 工多是累,改漏是壞掉,而且是安靜地壞——沒有 exception、沒有紅燈,通常是好幾個月後有人對報表才發現。
  • 批次更新做到一半失敗更糟:一部分列改了、一部分沒改,資料庫留在一個沒有任何人設計過的中間狀態。

這就是正規化要買的保險:把一個事實只存一份,那它就沒有「改漏」這個失敗模式可言。三個 NF 的判準見 正規化的三個階段是同一個問句的三種問法。

反過來說,這也是反正規化真正的代價——省下來的查詢時間可以用硬體買回來,資料不一致不行,見 拆表把成本集中在一次 join,不拆表把成本攤到每一列。