2013-02-19 85 views
2

我工作的一個網站,用戶可以使用此表結構發表文章:mysql的「喜歡」結構表

CREATE TABLE IF NOT EXISTS `articles` (
    `id_articles` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `id_users` int(10) unsigned NOT NULL, 
    `articles` text NOT NULL, 
    PRIMARY KEY (`id_articles`), 
    UNIQUE KEY `id_articles` (`id_articles`), 
    KEY `id_users` (`id_users`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

每個用戶可以「喜歡」的文章。

是,下面的正確的方式來創建一個「如表」:

CREATE TABLE IF NOT EXISTS `articles_likes` (
    `id_articles` int(10) unsigned NOT NULL, 
    `id_users` int(10) unsigned NOT NULL, 
    KEY `id_articles` (`id_articles`,`id_users`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
+0

是看起來不錯,你會像 'WHERE id_user = X',查詢最佳性能..但是我會用'id_articles'和'id_users'來創建一個複合主鍵,這樣你就只能像這樣一篇文章一樣。 – bitWorking 2013-02-19 14:33:40

+0

在添加'like'之前,我還可以檢查id_articles和id_users是否在這個表格中。 – Chris 2013-02-19 14:58:28

+0

是的,你可以......但你永遠不知道數據是如何進入db不久(web服務等)的,而且使用主鍵可以確保永遠不會有雙重入口 – bitWorking 2013-02-19 15:02:51

回答

2

這是一個有效的方式克里斯。您可以使用COUNT()articles_likes表中的id_articles與您在articles中查看的當前文章相匹配。

$articles_id = 23; 

mysql_query("SELECT COUNT(*) FROM articles_likes 
WHERE id_articles = ".$articles_id); 

你也可以離開COUNT()(MySQL的),並立即知道哪些用戶是對返回數組中的文章和使用計數()(PHP)的「likers」複製COUNT的影響()在MySQL中。

+0

Thanks for t他的回答:)) – Chris 2013-02-19 14:40:48

0

我總共有3個表格。一個文章表,用戶ID可以是提交文章的用戶的一個專欄,但是你需要一個單獨的用戶表,因爲並非所有的用戶都會提交文章(我假設),然後是第三個表,用戶的主鍵和文章的主鍵,並將它們用作外鍵。所以每次文章被喜歡時,在第三張表格中輸入一個條目

+0

克里斯在上面陳述的方式並不要求用戶發佈文章來表達文章上的「贊」。當編寫錯誤的代碼時,基於FK的綁定關係的方式很不錯:)。也許爲他添加一個例子來模擬它) – 2013-02-19 14:33:19

1

這是正確的,但是您希望在id_articles和id_users上添加separte索引(您也可以將列名'id_article'和'id_user '爲了理智)。

CREATE TABLE IF NOT EXISTS `article_likes` (
    `id_article` int(10) unsigned NOT NULL, 
    `id_user` int(10) unsigned NOT NULL, 
    KEY `id_article` (`id_article`), 
    KEY `id_user` (`id_user`) 
) ENGINE=InnoDB; 

要單獨的索引的原因是因爲在MySQL如果創建關於列的索引(A,B),該指數將在具有在where子句塔A的查詢,或列A和B中使用 在你的情況下,例如,如果你做了一個查詢「SELECT * FROM article_likes WHERE id_user = X」,這個查詢就不會使用索引。 更好的選擇是在組合索引的第二列上添加組合索引和單獨索引。就像這樣:

CREATE TABLE IF NOT EXISTS `article_likes` (
    `id_article` int(10) unsigned NOT NULL, 
    `id_user` int(10) unsigned NOT NULL, 
    KEY `id_article_user` (`id_article`, `id_user`), 
    KEY `id_user` (`id_user`) 
) ENGINE=InnoDB; 

這樣「WHERE id_article = X」, 「WHERE id_article = X和id_user = Y」

+0

感謝@Tiberiu加入這個答案:)) – Chris 2013-02-19 14:42:28

+0

關於你的語法KEY'id_article_user'('id_article','id_user')你爲什麼使用'id_article_user'而不是'id_article'? – Chris 2013-02-19 15:05:37

+0

因爲這是一個組合索引。如果我將它命名爲'id_article',開發人員會認爲這是id_article列上的索引,這不正確。 – 2013-02-21 11:34:28