2010-04-08 150 views
8

我有我的網站上的文章,我想添加標籤,將描述每篇文章,但我有問題與標籤設計MySQL表。我有兩個想法:如何爲標籤雲設計MySql表?

  1. 每篇文章將有場「標籤」和標籤將是格式:「標籤1,標籤2,標籤3」
  2. 創建其他的表稱爲標籤與字段:TAG_NAME,ARTICLE_ID

所以,當我想爲文章標籤ID爲1,我會跑

SELECT ... FROM tags WHERE `article_id`=1; 

但是,我也想知道3件,通過比較標籤最相似的物品,所以如果我有物品,其具有標籤「 PHP的,我sql,erlang「和5篇標籤爲」php,mysql「,」erlang,ruby「,」php erlang「,」mysql,erlang,javascript「的文章,我會選擇1.,3.和4.,因爲那些3與主文章具有最相同的標籤。

還有其他問題,獲得10個「最常用標籤」的最佳方法是什麼?

回答

18

一般來說,對於這種類型的許多一對多的關係,有三個表:

  • 的 「article」 表
    • 主鍵= ID
  • 的「 tag「表
    • 主鍵=編號
    • 包含每個標籤的數據:
      • 名稱,例如
  • A 「tags_articles」 表,其作爲一個連接表,並且只包含:
    • id_article:指向文章的外鍵
    • id_tag:指向標籤的外鍵


這樣,沒有任何標籤數據的重複:每個標籤,有一個且只有一個,在tag錶行。

而且,對於每篇文章,您可以有幾個標籤(即tags_articles表中的幾行);當然,對於每個標籤,你可以有幾篇文章。

獲取的標籤列表的一篇文章,有這樣的想法,是一種其它附加查詢的問題,如:

select tag.* 
from tag 
    inner join tags_articles on tag.id = tags_articles.id_tag 
where tags_articles.id_article = 123 


獲得了三個「最相似」的文章將意味着:

  • 選擇標籤上有第一篇文章的文章
  • 只使用那些具有最重要的相同標籤數

沒有測試,但一個想法可能是東西,應該是這樣的:

select article.id, count(*) as nb_identical_tags 
from article 
    inner join tags_articles on tags_articles.id_article = article.id 
    inner join tag on tag.id = tags_articles.id_tag 
where tag.name in ('php', 'mysql', 'erlang') 
     and article.id <> 123 
group by article.id 
order by count(*) desc 
limit 3 

基本上,你:

  • 選擇每個那是出現在你最初的商品標籤的物品的ID
    • 由於存在內連接,如果DB中的文章有2個標籤匹配where子句,而沒有group by cl因爲那篇文章會有兩行
    • 當然,你不想重新選擇你已有的文章 - 這意味着它必須被排除。
  • 但是,當您使用group by article.id,會有每篇文章
    • 只有一條線,但你可以使用count,找出每一篇文章多少標籤具有共同與初始一個
  • 然後,它只是按每個標籤數排序,只獲得第三個三行。
+0

是的,但你沒有回答我的主要問題,如何得到3個最相似的文章? – mfolnovich 2010-04-08 19:56:42

+1

@mfolnovich:我已經編輯了幾次我的答案,以添加更多關於設計的信息;然後,看到你的評論,我重新編輯,以添加一個可能的解決方案的想法,以獲得3最相似的文章。 – 2010-04-08 20:07:56

1

首先,您需要使用Pascal MARTIN對桌子設計的建議。

至於找到類似的文章,這裏有一些讓你開始。鑑於@article_id是要找到@標籤1 TAG2 @火柴,和,文章,@標籤3是該文章標籤:

SELECT article_id, count(*) 
FROM tags_articles 
WHERE article_id <> @article_id 
AND tag_id IN (@tag1, @tag2, @tag3) 
GROUP BY article_id 
ORDER BY count(*) DESC 
LIMIT 3 
0

是的,但你沒有回答我的主要問題,如何獲得3個最相似的文章?

答案: 只需在合併表(tags_articles)中查找相同的標記id即可。收集他們並創建一個模式。

例如: 第1條具有標籤:1,2- 第2條具有標籤:2,3,4 第5條具有標籤:-6,7,2 第7具有標籤:7,1,2, 3

如果您希望文章1的3個最相似的文章,您必須查找標籤1,2。你會發現第7條是最相似的,2和5有一些相似之處。