Postgresql
儲存記錄元數據的最佳實踐
在數據庫中儲存單個記錄的元數據的最佳做法是什麼?
我需要為我的數據庫中的許多表儲存常見的元數據,例如創建時間和上次更新時間。我找到了一些不同的解決方案:
- 將元數據直接儲存在表中。
優點:
元數據直接連結到記錄
檢索元數據不需要連接缺點:
需要很多重複的列(除非使用繼承)
元數據和業務數據不分離
- 使用軟外鍵創建通用元數據表並使用軟外鍵將數據連結到正確的表和記錄。
優點:
沒有重複的列
元數據與業務數據分離缺點:
元數據和數據之間沒有直接連結(不能使用 FK)
連接需要附加條件
- 為需要元數據的每個表創建單獨的元數據表。
優點:
元數據直接連結到記錄
元數據與業務數據分離缺點:
需要很多額外的桌子
需要很多重複的列(除非使用繼承)
是否有比我在這裡提到的更多的選擇、優點或缺點?儲存此元數據的最佳做法是什麼?
您正在談論的列佔用20 個字節(如果沒有填充對齊):
創建時間、更新時間和創建源
時間戳 .. 8 字節
時間戳 .. 8 字節
整數 .. 4 字節
單獨表中單獨行的元組標頭和項目標識符將佔用 23 + 1 + 4 = 28 字節加上 20 字節的實際數據,再加上最後的 4 字節填充。每行52 個字節。看:
關於儲存,您一無所獲。關於性能,您幾乎不會失去任何東西,每行僅增加 16 - 24 個字節。
列也直接屬於行,因此將它們放在一起是有意義的。我養成了將這樣的列(加上上次更新的單獨源)添加到所有相關表的習慣。
編寫 a 以使它們保持最新也更容易
TRIGGER ON INSERT OR UPDATE
。長話短說:強烈投票支持您的選項 1。
我會選擇選項 3:
如果元數據經常更新,而核心行不是。然後可能需要保留一個單獨的 1:1 表以使 UPDATE 更便宜並減少主表上的膨脹 - 甚至選擇選項 2。
我會選擇選項 2:
如果元數據列集高度重複。您可以在主表中的元數據集上有一個 FK 列。對於您的範例中的三個小列並沒有節省太多。