衍生欄位該拿掉的理由不是遞移相依

total_amount = price × count 常被當成第三正規化的教學例子,但它其實不是遞移相依,是衍生欄位(derived column)。兩者處置一樣、理由不同,混在一起會學歪。

  • 遞移相依:非主鍵欄位 A 相依於同一張表裡的另一個非主鍵欄位 B(遞移相依:欄位靠另一個普通欄位才連到主鍵)。
  • 衍生欄位:值是由其他欄位算出來的。total_amount 的來源 price 在拆表之後根本不在 orders 裡了,談不上「靠表內某欄位」。

兩者都該拿掉,但要記的是各自的判準:

  • 衍生欄位問「這個值可以算得出來嗎」——可以就別存,查詢時算。
  • 遞移相依問「這個欄位描述的是這一列的主體嗎」——不是就抽出去成一張表。

把衍生欄位掛到 3NF 名下的副作用是:會讓人以為「只要不是算出來的就沒事」,於是 store_name 這種真正的遞移相依反而被放過。

例外:算得出來但當下的值以後算不回來時要存,見 保留成交價不是反正規化,是另一個事實。