2

我正在一个网站上工作,用户可以在该网站上发布具有此表结构的文章:

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 ;

每个用户都可以“喜欢”这些文章。

这是创建“like table”的正确方法吗:

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;
4

3 回答 3

2

这是正确的,但您需要在 id_articles 和 id_users 上添加单独的索引(您也可能需要将列命名为 '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_user=X”、“WHERE id_article=X”、“WHERE id_article=X AND id_user=Y”之类的查询上获得最佳性能

于 2013-02-19T14:36:48.247 回答
2

这是克里斯的有效方式。您可以使用将表中的 与您正在查看的当前文章COUNT()进行匹配。id_articlesarticles_likesarticles

$articles_id = 23;

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

您也可以不使用 COUNT() (MySQL) 并立即知道哪些用户是文章的“喜欢者”,并在返回的数组上使用 count() (PHP) 来复制 MySQL 中 COUNT() 的效果。

于 2013-02-19T14:32:13.183 回答
1

我总共有 3 张桌子。一个文章表,用户 id 可以是提交文章的用户的列,但是您需要一个单独的用户表,因为并非所有用户都会提交文章(我假设),然后是第三个表的喜欢,这需要用户的主键和文章的主键,并将它们用作外键。所以每次点赞一篇文章时,都会在第 3 个表中创建一个条目

于 2013-02-19T14:32:30.420 回答