Postgresql

一張大桌子 vs 幾張小桌子

  • May 2, 2020

請注意,下面的範例只是一個範例,我的場景要復雜得多,而我嘗試對其建模的方式確實很有意義

假設我正在為我的一個應用程序中的審計事件創建一個表 - 所以所有的“event_created”、“user_created”等等。該表包含幾列,其中一些是其他表的外鍵。隨著時間的推移,這個單一的表可以增長到幾百萬條記錄。

從性能的角度來看,為所有事件使用單個表還是為每種事件使用單獨的表並在單獨的表上操作是否更快、更高效?還是沒有太大區別?為每種事件創建一個單獨的表可能聽起來很傻,但你需要相信我,在我的現實世界場景中,這真的很有意義。

非規範化僅作為最後的手段

不要因為想像中的性能問題而對錶設計進行非規範化。避免陷入過早的優化

設計合適的結構。生成假數據以填充表。在類似於您的部署方案的情況下執行測試。如果證明存在重大性能問題:

只有在用盡所有方法來解決已證明的性能問題之後,您才應該考慮非規範化。

Postgres 是一個強大的企業級數據庫系統。現代硬體上的幾百萬行具有足夠的 RAM 和明智的索引應該完全沒有問題。

另一方面,如果您的不同類型的事件代表不同的實體,那麼它們應該保存在單獨的表中。我們如何知道相似類型的行是否是不同的實體?可能會在詢問中找到線索:它們是否具有具有相同語義的大部分相同的列?您的使用者是否想要一起顯示或報告?您可能想要聚合(計算計數、平均值、中位數等)在一起嗎?

請注意,作為一個歷史悠久的產品,可以追溯到電腦硬體在功能和配置方面比今天的硬體更受限制的日子, Postgres 預設情況下在初始安裝時**具有相當保守的設置。**例如,預設情況下 Postgres 在較舊的Raspberry Pi上執行!因此,任何在功能更強大的硬體上執行更大數據庫的人都應該進行一些調整。

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