2013-03-03 52 views
-2

我正在PHP MySQL中開發一個論壇。我想讓我的論壇儘可能高效。如何高效地爲我的特定情況設計MySQL數據庫

我做了這兩個表

  1. tbl_threads
  2. tbl_comments

現在的問題是,有每個註釋下,喜歡和討厭按鈕。我必須存儲user_name,它已經點擊了Like或Dislike按鈕與comment_id。我製作了一列user_likes和user_dislikestbl_comments來存儲逗號分隔的user_names。但在這個論壇上,我讀到這不是一個有效的方法。我被建議創建第三張表來存儲喜歡和不喜歡的內容,並遵守我的數據庫設計與1NF。

但問題是,如果我做第三個表tbl_user_opinion做出這樣 1.兩個字段COMMENT_ID 2型(喜歡或不喜歡)

所以,我將不得不運行許多SQL查詢因爲我的網頁上有評論可以獲得每個評論的喜歡和不喜歡的數據。它會不會效率低下。我認爲我這裏有一些困惑。有人可以澄清這一點。

+0

Postgres可以使分層查詢比mysql更容易 – 2013-03-03 19:48:14

回答

0

您有這樣的關係方案:

有兩種方法可以解決這個問題。第一個,「乾淨」的是建立你的「喜歡」表,並在適當的列上做「計數(*)」。

第二個是在每個評論中存儲一個計數器,表明有多少上漲和下跌。 如果你想檢查,如果一個特定的用戶對評論投票,你只需要檢查一個條目,這樣你可以很容易地處理自己的查詢,並將它們合併到數據庫之外(爲此使用一個查詢生成comment_id以及用戶在特定線程中完成的投票種類)。

由於無法在沒有更高智能或解析字符串的情況下無法解析它,因此使用逗號分隔列表的方法不夠高效。如果你有一個數據庫 - 使用它!

(「同一個信息 - 一個數據集」!)

+1

如果我遵循第一種方法並創建一個單獨的表來存儲喜歡和不喜歡。那麼我的三張桌子之間就會有關係。首先,我將根據tbl_threads.thread_id = tbl_comments.thread_id從tbl_comments中檢索評論,然後我將通過從tbl_likes檢索數據來檢查登錄用戶是否喜歡或不喜歡每個評論。它不會是一個複雜和耗時的SQL查詢。 – 2013-03-03 11:59:54

0

的逗號分隔的列表違反atomicity的原則,因此1NF。您將很難保持參照完整性,並且在很大程度上也會查詢。

這裏是做一個標準化的方式的一種方法:

enter image description here

這是非常clustering - 友好:它的團體的票屬於同一物理評論併攏(同上,用於向下票),使下面的查詢相當有效:

SELECT 
    COMMENT.COMMENT_ID, 
    <other COMMENT fields>, 
    COUNT(DISTINCT UP_VOTE.USER_ID) - COUNT(DISTINCT DOWN_VOTE.USER_ID) SCORE 
FROM COMMENT 
    LEFT JOIN UP_VOTE 
     ON COMMENT.COMMENT_ID = UP_VOTE.COMMENT_ID 
    LEFT JOIN DOWN_VOTE 
     ON COMMENT.COMMENT_ID = DOWN_VOTE.COMMENT_ID 
WHERE 
    COMMENT.COMMENT_ID = <whatever> 
GROUP BY 
    COMMENT.COMMENT_ID, 
    <other COMMENT fields>; 

[SQL Fiddle]

如果您的工作速度足夠快,請對實際數據量進行測量。如果不是,則對模型進行非規範化並在COMMENT表中緩存總得分,並在每次向* _VOTE表中插入或刪除新行時通過觸發器保持它的當前狀態。

如果您還需要獲取特定用戶投票的評論,則需要索引* _VOTE {USER_ID,COM​​MENT_ID},即上面的主鍵/集羣鍵的相反。


這就是爲什麼我沒有包含附加字段只有一個投票表中去的原因之一可以是1(最多票)或-1(對於倒票):cover與二級索引效率較低。