2009-05-22 72 views
3

我已經構建了一個新聞網站: - 文章顯示在首頁按日期排序。最新的一個。 - 新聞與「id」,「title」,「text」等字段在「新聞」表中。 - 所有文章都標有1-5相關標籤。 - 標籤位於表格「標籤」中,字段爲「ID」,「標籤」,「物品」等一些標籤。 - 「tags」字段「article」適合「news」字段「id」。最好的數據庫(MySQL)結構:包含有利標籤的文章

現在我想讓用戶有機會給他的「偏好標籤列表」添加標籤。那麼用戶應該只能看到包含一個有利標籤的新聞文章。

假設用戶Bob有利於標籤「barack obama」,「nba」,「new Jersey」和「dogs」。他只能看到包含這四個標籤中至少一個的文章。

我該如何編寫一個PHP/MySQL腳本來實現這個功能?我認爲我的數據庫結構不適合這個目的,是嗎?我必須做這樣的數據庫查詢:

「SELECT * FROM news WHERE id IN(SELECT article FROM tags WHERE tag IN('barack obama','nba','new jersey','dogs')) 「

該查詢會運行很長時間,不是嗎?必須有一個比我的更合適的數據庫結構。你有這個問題的想法嗎?我需要哪種數據庫結構,然後我必須使用哪些查詢?

我希望你能幫助我。提前致謝!

回答

8

以下絕不是詳盡的/權威的,但它應該讓你朝着正確的方向前進。

表:

news 
===== 
id 
title 
text 

tag 
=== 
id 
tag 

tag_map 
======= 
tag_id 
news_id 

favorite_tags 
============= 
user_id 
tag_id 

查詢

SELECT * 
FROM favorite_tags 
JOIN tag_map ON favorite_tags.tag_id = tag_map.tag_id 
JOIN news ON tag_map.news_id = news.id 
WHERE favorite_tags.user_id = $userid 
+0

非常感謝您爲這個快速而好的答案。我有最後一個問題:我應該在哪些字段上設置索引?我選擇了「新聞」中的「id」作爲主要參數,將「tag」作爲主要參數,將「tag」選作「tag」中的唯一參數,將tag_id,news_id作爲主參數,將「news_id」作爲「tag_map」最後,「user_id,tag_id」作爲主要參數,「favorite_tags」中的「tag_id」。它是否正確? – caw 2009-05-23 09:04:55

+0

粗略的看起來似乎是正確的,但是,通過填充表格並進行「EXPLAIN SELECT」等操作來進行雙重檢查。 – 2009-05-23 14:43:20

1

查詢的性能(無論是在你的子選擇的方法,或者弗蘭克農民更優雅的加入爲基礎的一個)將主要依賴於指數。請記住,MySQL只使用每個表的一個索引,並且適當的一組索引(取決於您想要優化的查詢)總是變得非常明顯...