反正規化要排在索引與物化視圖後面

「查詢很慢所以不要拆表」是從第 1 步直接跳到第 5 步。中間那三步才是大多數情況真正的解法。

  1. 先正規化。 它是預設值,不是一種優化選項。
  2. 量到真的慢——看執行計畫,不是憑「join 了三張表感覺會慢」。
  3. 加索引,尤其 covering index;很多時候一條就把 join 的成本抹平。
  4. 物化視圖 / 讀模型 / 快取:一樣是放重複資料,但放在一個明確標記為衍生的地方,壞掉重算就好,原始資料仍然只有一份。
  5. 最後才手動反正規化,並且清楚接下「我從今天起自己負責讓這兩份資料同步」這個責任。

第 4 步和第 5 步的差別是整串的關鍵:兩者都存了重複資料,但只有第 5 步把一致性的責任交還給人。 人會忘,見 改漏一列的代價不是工多,是資料安靜地不一致。

要判斷值不值得,成本模型見 拆表把成本集中在一次 join,不拆表把成本攤到每一列——不要用「關聯了幾張表」當判準。