2013-05-17 21 views
0

我的申請有3個實體:user,tagquestion如何有效查詢「最新問題」?

這些實體之間的關係:

  1. user可以選擇tag就是他們有興趣
  2. tag s時,可以附接至question小號

這是或多或少等的關係在stackoverflowquora的相應實體之間。

現在我想添加一個名爲「最新問題」頁面,在其中我要去渲染標籤的訪問用戶感興趣的一些最新問題。

我怎樣纔能有效地實現這一點?

比方說,訪問用戶是userA。 我現在能想到的解決方法是:

  1. 獲取所有標籤userA有興趣從一些關聯表
  2. 沒有做防question_tag表的IN查詢來獲取相關question_id小號
  3. 查找question_id S IN一個question表,並命令由time desc

結果因此有兩個IN查詢在這裏,並且由於某個用戶的數量可能相當大(可能是數千),恐怕這個解決方案不夠快。

我想編碼多個標籤,並將結果放在question表的列中,有什麼好的方法可以做到這一點?

+0

如果你有一個時間戳索引,選擇按時間戳排序的頂部將是非常快的。 – Patashu

回答

1

您需要將時間戳字段添加到該列表中,然後僅通過帶有限制的時間戳獲取列表排序。假設SQL:

select question from listofquestions 
    order by whenitwasasked desc limit 5 
0

解決方案#1
在擴展mikebabcock的回答,您可以實現與具有.分離標籤名稱的TEXT字段標識。例如,.php.object-oriented.。然後,當你建立你的數據庫查詢,使用類似的東西:

select `question` from `questions_tbl` 
    /* list of tags... */ 
    where `tags` like '%.php.%' 
    or `tags` like '%.object-oriented.%' 
    /* sort results */ 
    order by `ask_time` desc limit 5 

如何有效的,這是真的取決於你所使用的數據庫引擎。這很可能與原來的解決方案一樣慢(或更慢)。

解決方案#2
有兩個表來索引你的標籤。一個將用戶映射到標籤,另一個將標籤映射到問題。然後,執行一些連接語句來過濾相關問題。例如:

select q.* from 
    /* inner join user index and question index */ 
    `usr_tags` ut inner join `ques_tags` qt on ut.tagID = qt.tagID 
    /* inner join index to questions */ 
    inner join `questions_tbl` q on q.id = qt.quesID 
    /* filter conditions */ 
    where ut.usrID = 'users_id' 
    order by q.askTime desc limit 5 

我建議使用一些相關數據進行基準測試,以確定最快的數據。

+0

就我而言,可以有數百甚至數千個'tags'。 – satoru