2012-05-22 37 views
3

我們使用django-dbarray模塊在postgres中使用數組。我一直在做一些有關postgres數組的研究,一些開發人員表示他們不會推薦使用存儲超過X值的postgres數組。有時候,這是十個,我聽過多達三十個。關於在性能開始逐漸減少之前可以或應該在數組中存儲多少個值,是否存在共識?Postgres陣列

作爲參考,上面的DB主要是一個只讀DB。

我們正在嘗試確定我們應該在哪裏使用中間表以及我們應該在哪裏使用postgres數組。

一個額外的相關問題:當​​針對表中的列創建索引時,該列存儲數組值(比如bigint [])。我意識到存儲在數組中的值不會被索引,但只有數組本身(我假設這就像一個C指針)。與簡單地使用中間表相比,這有多高效?

我們可能需要根據值創建連接或在where子句中具有某些特定值,而且我擔心某些性能可能會降低,並且我們可能會更好地使用中間表,只要我們可能需要創建一個連接。

最後,考慮到我們正在使用dbarray,那麼與簡單地使用帶有標準django ORM的中間表(假設沒有聯接是上述問題中的子句)的效率是什麼?

謝謝

+1

我是認爲X不應該大於1的開發人員之一。數組和數據庫通常是不好的mojo ......他們不再是'自由文本'字段,這使得查詢和排序執行得非常糟糕,特別是如果你試圖加入數組中的特定值。如果你從不打算編寫SQL,我想它可以用作基本的數據存儲。如果你想寫SQL對它...我的偏好從我在這裏看到的是將它移動到一個名稱 - 值對錶,這將允許靈活性,以便您在表中存儲哪些字段(所以是中間表)。 – Twelfth

回答

3

PostgreSQL支持GINGiST指標超過intarrays,它允許你運行像這樣的疑問:

SELECT * 
FROM mytable 
WHERE myarray @> ARRAY[1, 2] 
-- returns arrays which contain 1 AND 2 

或本:

SELECT * 
FROM mytable 
WHERE myarray && ARRAY[1, 2] 
-- returns arrays which contain 1 OR 2 

有效。

使用規範化模式有效地重寫第一個查詢有點難。