Mysql

在數據庫表之間複製值還是創建引用更好?

  • April 8, 2022

我正處於十字路口,我不知道哪個是最好的選擇。

假設我有一個包含地址和其他資訊的表 A。正如您所料,許多行包含相同的地址(但其他資訊可能不同)。然後我有一個只包含地址的表 B。這是最好的選擇:

  1. 把A表中的地址數據去掉,添加一個引用B表對應地址的外鍵
  2. 保持一切原樣,每次創建新的 A 行時,地址數據都會從表 B 複製到 A

解決方案 1 讓我節省空間並確保我的一致性,因為數據是綁定的。另一方面,如果我更改表 B 中的一行,則 A 的所有行都會受到影響。此外,我需要更改很多程式碼(例如以前的程式碼 tableA.row

$$ 0 $$.address 變成了 tableA.row$$ 0 $$.TableB_reference.address),所以它會導致很多錯誤。 解決方案 2 獲得更多的數據庫空間,因為數據重複並且數據可能“損壞”或變得不一致。另一方面,如果在某個時間點我更改了 tableB 行,則只會影響 tableA 的新行,而不會更改“舊”行。此外,它不需要更改大量程式碼(tableA.row

$$ 0 $$.address 仍然是有效程式碼) 你有什麼建議?有什麼不同的解決方案嗎?

謝謝指教

這在很大程度上取決於這兩個表的用途。例如,如果表 A 是關於一個城市的商店,表 B 是關於一個城市的客戶,那麼這兩個地址完全不相關,連結它們沒有任何意義。在不同的場景中,如果表 A 是關於一家公司的員工,而表 B 是關於公司足球隊的成員,那麼每個足球運動員也是一名員工,並且地址重複是 a) 冗餘和 b) 容易出現數據差異。

數據庫中的冗餘資訊是禁忌。

該指南告訴您要走哪條路。

(在某些情況下,性能需要違反準則。當您有一個包含數百萬行的表時,請返回一些慢查詢以獲得幫助。)

至於JOIN獲取“標準化”數據所需的內容,這通常沒什麼大不了的。節省的空間有些重要。並且能夠更改所有事件的值可能是一個好處。

不要標準化數字或日期。任何對此類進行範圍檢查的嘗試都是非常低效的。

如果你想看看是否可以違反我剛剛給你的指導方針,請提供一個具體案例。

引用自:https://dba.stackexchange.com/questions/310714