2016-08-14 87 views
0

我想爲某個功能添加井號標籤,我想簡單地將它們存儲爲每個對象的數組,然後讓用戶搜索它們自己的項目標籤(一組標籤),然後執行搜索。有沒有一個好的方法來做到這一點?在數組中搜索Postgres數組

例如: 在數據庫中的標籤:

row 1: ['red', 'blue', green'] 
row 2: ['orange', 'blue'] 
row 3: ['blue', 'green'] 

,然後將用戶的搜索將是這樣的:

['red', 'green'] 

,其結果將是行1和3

這是一個非常緩慢和低效的方式來存儲這些?如果我給用戶多種選擇以這種方式進行搜索,我將如何獲得最佳性能?

+0

這是我的不好!哈哈,我會解決這個問題! – fjaxyu

+0

爲了性能優化,您需要提供更多信息,從Postgres版本,表格定義,基數,最小值,最大值,平均值開始:數組長度,屬性長度,搜索中的屬性數量,查詢數量。讀/寫模式?這一切都取決於...遵循[標籤信息中的\ [postgresql-performance \]](http://stackoverflow.com/tags/postgresql-performance/info) –

回答

1

這裏有兩種方法:

  1. 使用的Postgres如你所說的陣列。這使您的行易於閱讀,並且相當簡單。它還允許您根據需要對您的代碼進行排序,而無需單獨存儲索引。如果走這條路線,應該使用&& operator來確定搜索標記是否與其他標記重疊(例如,與在循環中運行查詢相反)。
  2. 使用單獨的表格來存儲對象標籤關聯。在這樣的表格中,一列是tag(或者如果您想稍後修改標籤元數據,則爲tag_id),另一列爲與標籤相關的object_id。您可以擁有多個與同一個對象關聯的標籤以及與同一個標籤關聯的多個對象。然後,您可以使用此表上的標準joinin filter來獲取與您請求的標籤匹配的所有對象ID。這是不支持數組的數據庫管理系統通常使用的方法。
+0

所以對不起,我花了這麼長的時間接受這個!但是我剛剛完成了這部分程序,最終寫出來了,這部分工作非常有效!非常感謝! – fjaxyu