常見到使用tag查詢是點單一tag,少數是可以選數個tag,然後再點查詢.
雖然查詢多tag對使用者來說,使用體驗較好,但是使用此方式的網站較少.
一來查詢方式組SQL可能較為麻煩,二來可能也是效能考量.
在上篇的例子中,我們有建立一個tags的table,並且有做unique index.
這樣可以確保tag的唯一性,通常用在較為嚴謹的系統,例如物料屬性,
希望不要過於發散,使用勾選的方式等等.
另一種情境是可以讓使用者自行建立,例如一些討論型態的網站,如ithelp,或是blog等等.
當不需要很嚴謹的系統,我們可以進一步反正規化,直接將tag的文字型態存到標的table,當然也可以在輸入或選擇介面上做控制,這時候查詢就不需要再跟tag table 做 join, 取得tag 的 tag_name or tag_val.
可以看到使用了 @>, @@> 兩個運算子, 還能做 wildcard search!
感謝葉賢大大提供回饋!
@@> 部分是安裝 parray_gin 之後才有的.
上面的例子看起來不錯,但是資料量大時…
使用資料庫,大家都知道可以建立index,提高查詢效能.
當我們有使用tag table時,可以透過它的index.
目前使用array 直接在標的table放資料,我們就需要在建立能夠處理array的index.
上一篇中,有建立了gin 型態的index.現在就來使用看看.
由上面的例子,看來好像不錯喔,那我們接著試試看,text型態的array 建立index.
看來是無法很好的處理,成本還很大…
GIN Index 要處裡text 型態,好像不能直接使用啊…
我們來看看一篇有名關於GIN的文章
Understanding Postgres GIN Indexes: The Good and the Bad
裡面有提到可以使用tsvector的方式,還有GIN的後繼者RUM.
但是要使用tsvector還要再加工,而且對我們中文使用者來說,不是很好用.
為了更方便的處理GIN與text array,有人貢獻了
parray_gin 這個extension
來看看怎樣使用,安裝過程我省略了.make, sudo make install搞定.
可以看到這樣就很方便的可以直接使用了.
PostgreSQL array 搭配 GIN Index, 加上parray_gin extension,
可以讓我們在處理tag時,很方便直觀的使用.
感謝許多在PostgreSQL及Open Source貢獻的人,雖然不見得有很好聽的頭銜,但是默默的付出,讓世界更美好.