2011-01-25 34 views
2

最近在web應用上工作,我決定在數據模型中使用integer []。有兩張表,一張帶有文章數據,另一張帶有標籤(標籤ID和說明),決定了文章將在article.tags integer []列中標記的標籤ID。PostgreSQL - integer []最佳實踐

正如Milen A. Radev指出:

提示:數組不是集合;搜索特定的數組元素可能是數據庫錯誤設計的標誌。考慮使用一個單獨的表,每行包含一個數組元素。這將更容易搜索,並且可能對大量元素更好地擴展。

不僅如此,而且必須使用JDBC和iBatis處理integer [],我應該說「有趣」。

目前,我可以擺脫正在執行的工作實施。爲了簡單起見,可能會使用存儲article.id和tag.id關係的單獨表格進行重新工作。

最後,我對什麼是最好用的integer []和什麼上下文感到困惑?

我想我很難想象它不適合什麼。

回答

4

恕我直言,因爲任何數組是違反1NF,最好的上下文是:...(drumroll).....無。

這就是爲什麼我們會有數據,而不是被查詢的問題。所有的值都有可能被搜索,如果我們不應該在可搜索的值上使用數組,我們會再次得出它永遠不值得使用的結論。

這隻留下一個假設的情況,即您只是爲了在客戶端上進行分析和操作而存儲數組。我確信這些都存在,但不是以我的經驗。

編輯:上面我說:「我確定這些存在......」看看@mu是一個例子太短的答案。

0

整數[]對於轉換表格很有用。關鍵是索引,並且已知每個索引都有一個值,或者有一些表示空位置(如-1)。我認爲在這種情況下,它會比外鍵快。

另一種用途是圖表。每次測試的結果是什麼?測試運行有6個結果。是一行,整數[]是6個結果的數組。

4

我能想到三個應用:

第一個是非規範化。權衡包括:您無法輕鬆更新或單獨處理元素。但一次可以輕鬆快速地獲取所有這些內容。它還節省了大量的空間。

第二個稍微相關的是,您使用的數組不是用於存儲,而是用於某些中間處理。例如,如果您希望以非SQL語言批量處理數據,而該語言不能輕鬆處理正確的集合。

第三個用於存儲有序的數據列表。我遇到過這樣的一些應用程序,但很難指責它。當然,你也可以在表格中用一個額外的位置表示來表示,但有時這並沒有什麼意義,因爲你不需要單獨訪問數據庫中的各個部分。在某些情況下,這只是客戶機應用程序想要稍後存儲和檢索的列表。

但是你的整體感覺是對的。如果你不知道更好,你的第一本能應該不是使用數組。

+0

......你的第一點正是我所追求的。 – vector 2011-01-26 13:02:02

1

IFF數組是一個整體值,我可能會考慮使用數組數據類型。但是當數組只是一個整體的值?我不知道。

也許當它會只有作爲一個整體搜索值更有意義。在你想知道相應的行之前,有一張表應該包含你正在搜索的項目,這似乎沒有多大意義。所以如果你想搜索完整的數組作爲關鍵。

5

我在處理樹結構(如註釋線程)時使用了PostgreSQL中的數組。您可以將從根節點到您的節點的路徑存儲爲分支數組的數組。然後,按照正確的顯示順序拉出整棵樹是一件簡單的事情:

SELECT stuff 
FROM comments 
WHERE thread = X 
ORDER BY path -- This would be the array. 

PostgreSQL以唯一明智的方式比較數組。使用數組作爲來自根的路徑也爲您提供了一種計算節點深度的簡單方法。你可以使用一個字符串(例如每個分支號碼有3到96位數字)和ASCII-betical排序來達到同樣的目的,但是一個數組更清晰。

是的,還有其他方法可以處理更迂迴正確的樹木,但使用陣列提供了清晰的實現。如果我正在做大量的樹操作,那麼維護路徑數組將涉及很多繁忙的工作,所以我可能會用不同的表示法。

不完全是Java特定的,但有些情況下數組是一種自然而有用的表示(即使在SQL中)當前數據。

+1

神奇的例子。 – 2018-01-15 19:45:47