保留成交價不是反正規化,是另一個事實
「訂單要查得到購買當下的價格,所以不能照正規化拆表」——這是常見的誤解。成交價和商品現價是兩個不同的事實,把成交價存進訂單完全符合「一張表只描述一個事實」。
items.price描述的事實是「這個商品現在賣多少」,會隨時間變。orders.unit_price描述的事實是「這筆交易當時成交在多少」,一旦成立就永遠不變。
它們只是碰巧在下單那一刻數值相同,不是同一個欄位的複本。用商品現價去回推歷史訂單,本來就是錯的,跟拆不拆表無關。
判準
衍生欄位的預設是別存(衍生欄位該拿掉的理由不是遞移相依),但只要符合「當下算得出來、以後算不回來」就必須存下來:成交價、當時的匯率、當時的稅率、寄送時的地址。這類欄位常被誤標成反正規化而被砍掉,砍完就再也救不回來。
實作上值得連單位與幣別一起存,否則 語意變更不能 additive-first,一律當 breaking 的問題會在歷史資料上重演——欄位還在,意思已經換了。