2013-02-19 88 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