2010-12-13 20 views
2

可能重複:
How do you recommend implementing tags or tagging最好的實現標籤(類似的StackOverflow)

我有一個包含若干條數據庫的網站。我想在stackoverflow上實現類似於標籤的標籤。

我能想到的實現它們兩種基本方式:

  1. 與我的文章表中的一個一對多的關係,創建一個單獨的標籤表。

  2. 添加標籤文本字段到我的文章表。

第一種方法似乎是最好的,但需要兩個額外的表,這將增長得相當大。似乎也會有相當大的開銷更新和維護這些數據。

第二種方法將更容易實施和維護,並使用更少的資源。但是搜索效率會降低。我可能會使用LIKE或甚至全文搜索。

我對其他人認爲最好的方法很感興趣。或者也許還有另一種方法。

+0

也[如何實現標記系統](http://stackoverflow.com/questions/1810356/how-to-implement-tag-system) – 2010-12-13 23:11:29

+0

謝謝,我確實看過,但不能使用正確的搜索條件。我已經打印出所有這些線程了。 – 2010-12-14 00:16:11

回答

7

我個人會選擇1,你後面再提兩個表格,所以我假設你在考慮。

Table -Tag 
Fields - TagID, TagName 

Table -TagArticle 
Fields - ArticleID, TagID 

Table - Article 
Fields - ArticleID, blah, blah, blah 

與傾倒到文章中的字段相比,這不需要更多的存儲方式。再加上它是正常化的,它將永遠支持你的未來,並將使你的數據庫能夠更好地通過標籤搜索文章。至於更新,相比於你閱讀的次數,你偶爾會偶爾更新,所以影響應該可以忽略不計,除了確保你的索引是最新的,你不會想到任何維護任務無論如何都必須在其他桌子上做,並且應該是自動的。

附加福利意味着您可以快速創建頂級標籤列表或標籤雲等內容。

+0

好吧,我希望它需要更多的存儲額外的表和關係,但也許它會被不必重複標籤詞本身足夠抵消。我的實際情況可能會更復雜一些。例如,我可能有不同類型的標籤鏈接平臺,語言,庫等。我不確定,但這種方法也應該很好地工作。謝謝。 – 2010-12-14 00:20:53

+0

@Jonathan Wood - 我不確定表的開銷,但是如果你使用一個int來表示每個int有4個字節的ID,那麼tagarticle每行包含8個字節,varchars是每個字符1個字節+ 2字節開銷。把你的問題上的3個標籤需要24個字節,將它們存儲在一個文本字段中(假設你使用1個字符分隔符)需要30個字節,標籤文章列上的2個索引可能會抵消你的全文索引以搜索標記字段。 – Robb 2010-12-16 20:46:03

+0

那麼,除了表格本身之外,你還需要索引。但我實際上更關心維護數據所需的開銷。在文本字段中,您只需保存用戶輸入的數據。使用多個表格,你必須對數據庫進行一些檢查:這個標記是否已經定義 - 如果不是,那麼這篇文章就已經與這個標記相關聯 - 如果沒有,就創建。和類似的步驟來刪除標籤。對於連接到Web的數據庫,它肯定會表示額外的工作量。也就是說,我仍然傾向於你所建議的方法。只是想知道效果。 – 2010-12-16 21:50:08

2

第一種選擇顯然是兩者中最好的。這適用於關係模型,並使數據標準化。第二個選項針對關係模型,並打破標準化。你如何運行諸如「給我最受歡迎的十大標籤」之類的查詢?或者「標籤'x'被使用了多少次?」對於選項1,這些查詢變得微不足道,特別是(假設Robb的模式),您可以針對每個標籤保留一個Count列。

選項2使您在功能損失方面稍微簡化(從長遠來看,我認爲效率也如此)。關係模型已經過嘗試,測試和工作!用它!

+0

謝謝,所有有效的點。 – 2010-12-14 00:21:42

相關問題