2010-09-16 66 views
9

我有3個計劃:如何設計StackOverflow問題標籤之類的模式?

1,在問表:

question 
------------------------------------ 
id title content ...  tags 
------------------------------------ 
1 aaa  bbb  ...  tag1,tag2,tag3 (use , to split more tags) 

2,在標籤表和拆分:

tags 
------------------------------------ 
id tag 
------------------------------------ 
1 tag1,tag2,tag3 (use , to split more tags) 

3,在標籤表:

tags 
------------------------------------ 
id tag 
------------------------------------ 
1 tag1 
2 tag2 
3 tag3 

我認爲計劃3更好,但您的意見是什麼?

此實現的其他好主意?

感謝您的幫助:)

+2

請參見[ 你如何推薦實現標記或標記 (http://stackoverflow.com/questions/20856/how-do-you-recommend-implementing-tags-or-tagging)。 – 2010-09-16 23:59:15

回答

12

這些模式被稱爲mysqlicious,scuttletoxi(從最小到最規範化)。

他們都有他們的好處和缺點。你可以在這裏閱讀相當不錯的分析:

http://forge.mysql.com/wiki/TagSchema (WayBackMachine Version)

注意mysqlicious在很大程度上取決於你的數據庫的有效執行FULLTEXT搜索能力。

這意味着對於MySQLInnoDB和其他一些系統,這是非常不切實際的。

1

取決於您希望數據如何規範化。

首先,當我在表格中看到一個不是唯一的「id」列時,我會畏縮。至少將列重命名爲「question_id」。

其次,它取決於您是否想快速列出所有已定義的標籤。在這種情況下,您需要一個單獨的標籤表來定義一組可能的標籤,然後是一個提供多對多關聯的問題和標籤之間的中間表。

6

標籤和內容之間的關係是many-to-many。這意味着一個標籤可以與多個內容單元相關聯,而一個內容單元可以與多個標籤相關聯。

要在數據庫中執行此操作,可以使用名爲ContentTags的輔助表。 ContentContentTags的關係是一對多關係; TagsContentTags的關係是一對多關係。

#Tags Table 
Id Text 
1 'Tag1' 
2 'Tag2' 
3 'Tag3' 


#Content Table 
Id Content 
1 "some content" 
2 "other content" 
3 "more content" 

#ContenTags Table 
ContentId TagId 
1   1 
1   2 
2   1 
2   2 
2   3 
3   1 

正如你可以看到,這種關係被清楚地反映(內容1與標籤1和2相關聯;內容2與標籤1,2相關聯,和3;內容3僅與標籤1相關聯)

1

正確的做法是創建一對多關係,即您有一條評論和多個標籤。來自WIKI

在數據庫技術中,當一個實體與另一個實體中的多個事件相關時,會出現一對多(也稱爲一對多)關係。例如,一個俱樂部有很多成員。

而數據庫設計中的主要概念是Database normalization

所以我會這樣做。

comments 
------------------------------------ 
id_comment title content 
------------------------------------ 
12   aaa  bbb 

tags 
------------------------------------ 
id_tag comment_id tag 
------------------------------------ 
1  12   tag1 
2  12   tag2 
3  12   tag3 
+0

這種設計將在**標籤**中擁有大量冗餘**,因爲許多評論共享相同的標籤。例如,我們可以有一百萬個標記爲「tag1」的評論。順便說一句,如果我接受冗餘,那麼我會看到另一個問題:將** id_tag **和** tag **同時放入**標籤表**中沒有用處。我們只需要標籤,**如果此表已經有comment_id **,則不需要id_tag。 – 2016-04-28 12:50:39