2012-10-19 48 views
0

說明:建立評分系統:數據庫結構涉及user_id?

我建立一個評級系統mysql/php。我很困惑我將如何建立數據庫。

這裏是我的文章設置:

文章表:

id | user_id | title | body | date_posted 

這是我認爲的評價表:

評分表:

id | article_id | score | ? user_id ? 

問題:

我不知道我是否應該將user_id放在評分表中。我的計劃是使用這樣的查詢:

SELECT ... WHERE user_id = 1 AND article_id = 10 

但我知道它的冗餘數據,因爲它存儲了user_id兩次。我應該找出桌子上的JOIN還是結構良好?

+1

如果您不重複使用'article_id',那麼不是'article_id = 10'足以獲得唯一的結果嗎?或者是'user_id'用戶進行評分 - 在這種情況下它不是多餘的? –

回答

0

你不應該,由於是第三範式,你需要保持獨立性。

「第三範式(3NF)是用於數據庫規範化的一種常規形式。3NF最初由EF Codd於1971年定義。[1] Codd的定義指出,一個表在3NF中當且僅當下列條件成立:

  • 的關係R(表)是在第二正常形式(2NF)
  • R的每個非主屬性是非傳遞地依賴(即直接依賴)上R的每一個超密鑰「

來源的位置:http://en.wikipedia.org/wiki/Third_normal_form

第一範式:http://en.wikipedia.org/wiki/First_normal_form

第二範式:http://en.wikipedia.org/wiki/Second_normal_form

你應該看看正常化和E/R模型,它會幫助你很多。

正常化維基百科:http://en.wikipedia.org/wiki/Database_normalization

+0

好吧,我知道這不會正常化,哈哈。我想我不知道如何在評級表中沒有'user_id'的情況下檢索數據。 – Phil

2

我看不出有什麼毛病使用這種方法。被存儲兩次的用戶標識不是特別相關,因爲一個是關於評分條目的,另一個我假設與物品所有者有關。

這種方式的好處是可以防止被記錄每個用戶的多個得分由製作的article_id和user_id說明獨特,使用更換成管理得分。

有很多事情來闡述這取決於該評級系統是否應該有智慧來防止遊戲等用戶羣有多大,等上

我敢打賭,對於任何一個普通人來說,這種設置對於一個相對較大規模的系統都不會有害。

...半無關:

僅供參考,根據該分數的重要性和遊戲方面,你可以使用STDDEV()對比分列取平均保標準偏差...

SELECT STDDEV(`score`) FROM `rating` WHERE `article_id` = {article_id} 

這可能會影響異常值,假設你關心它是否看起來像人們在特定的文章上拼湊起來拍攝下來,或者沒有正確的原因讚美它。

+0

非常感謝!我將使用'STDDEV'。 – Phil

2

這取決於。我假設這些文章對個人用戶是獨一無二的?在這種情況下,我可以保留USER_ID在你的等級表,然後就改變你的查詢:根據你想拉什麼信息

SELECT ... WHERE article_id = 10 

SELECT ... WHERE user_id = 1 

您不是「存儲user_id兩次」,而是使用user_id將文章鏈接到與另一個表中的用戶關聯的唯一數據。除了在查詢中,您正在採取正確的方法。

+0

我的目標是將文章評分的平均值與發佈該文章的用戶一起提取。 Article_id可以有100個相同的值,我會將平均值拉低。我想我可以用'article = 0'來解決這個問題,謝謝。 – Phil

+0

@Phil其實......要澄清的是,評級的user_id是文章作者的user_id還是評價它的用戶的user_id?我假設後者...如果不是,我的答案可能不正確。 – Mike

+0

我的意思是以前的用法,但是你指出了我的正確方向。哈哈。我沒有把'user_id'放在評級表中,抱歉讓我感到困惑。 – Phil