1

我看到Postgres的陣列是良好的性能,如果數組的元素是數據本身,例如,標籤PostgreSQL數組可以針對連接進行優化嗎?

http://shon.github.io/2015/12/21/postgres_array_performance.html

怎麼樣,如果我使用數組的方式來存儲整數的外鍵?禁止外鍵約束問題,建議使用整型數組存儲外鍵?

應用程序應針對報表或分析進行優化。因此,如果應用程序最終將大部分時間加入數組,那麼應用程序需要顯示外鍵的標籤/標題/名稱,使用數組存儲外鍵仍然可以嗎?

與使用聯結表相比,數組較小時性能會更好嗎,比如說電影流派整數的複選框?

如果數組的數量是幾千,那麼當不使用數組時性能會更好,而只是使用結點表呢?

回答

1

不,將FK存儲在數組中對於通用表格來說永遠不是一個好主意。首先,您提到的事實是:數組元素的外鍵約束尚未實現(但)。這一點應該使這個想法失效。

曾試圖實施Postgres 9.3的功能,該功能因嚴重的性能問題而停止。 See this thread on pgsql-hackers.

此外,雖然在某些使用情況下可以通過數組提高讀取性能,但寫入性能會直線下降。想一想:爲了插入,更新或刪除長數組中的單個元素,現在必須爲每個已填充的元素編寫一個具有整個數組的新行版本。我也看到了嚴重的鎖爭論。

如果你的表是只讀,這個想法開始變得更有意義。但後來我會考慮用歸一化的許多一對多的實施頂部非標準化陣列一個materialized view

雖然是在它時,MV可以包括所有連接表和爲了更好的讀取性能(對於典型用例)生成一個平臺。通過這種方式,您可以獲得良好的讀取(和寫入)性能 - 參考完整性 - 以管理MV的開銷和額外存儲爲代價。

+0

可能的例外是系統目錄,其中FK約束由兩個* parallel *數組表示。但是:這些數組非常小,目錄上的更新並不常見,並且由* internal *邏輯執行,而不是由DML語句直接執行。 – wildplasser

+0

我必須承認,我發現它的習慣和直觀,模型是數組,然後將模型作爲數組存儲。但是,只有速度才能達成交易。如果數組無法提供速度,我不會使用它。我仍然沒有找到一個基準,在這個基準中,實現爲數組並且加入參考表的外鍵(不是標籤類元素)導致與聯結表實現相比執行速度更快的查詢。 –

相關問題