衍生欄位該拿掉的理由不是遞移相依
total_amount = price × count常被當成第三正規化的教學例子,但它其實不是遞移相依,是衍生欄位(derived column)。兩者處置一樣、理由不同,混在一起會學歪。
- 遞移相依:非主鍵欄位 A 相依於同一張表裡的另一個非主鍵欄位 B(遞移相依:欄位靠另一個普通欄位才連到主鍵)。
- 衍生欄位:值是由其他欄位算出來的。
total_amount的來源price在拆表之後根本不在orders裡了,談不上「靠表內某欄位」。
兩者都該拿掉,但要記的是各自的判準:
- 衍生欄位問「這個值可以算得出來嗎」——可以就別存,查詢時算。
- 遞移相依問「這個欄位描述的是這一列的主體嗎」——不是就抽出去成一張表。
把衍生欄位掛到 3NF 名下的副作用是:會讓人以為「只要不是算出來的就沒事」,於是 store_name 這種真正的遞移相依反而被放過。
例外:算得出來但當下的值以後算不回來時要存,見 保留成交價不是反正規化,是另一個事實。