【问题标题】:mysql 'likes' structure tablemysql 'likes' 结构表
【发布时间】:2013-02-04 06:30:03
【问题描述】:

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

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;

【问题讨论】:

  • 是的看起来不错..但我会用id_articlesid_users创建一个复合主键,这样你就只能喜欢同一篇文章。
  • 在添加“like”之前,我还可以检查 id_articles 和 id_users 是否在此表中。
  • 是的,你可以......但你永远不知道数据是如何很快或稍后进入数据库的(网络服务等)。使用主键,您可以确保永远不会出现重复条目​​。
  • @redreggae:好的,谢谢

标签: php mysql database create-table


【解决方案1】:

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

$articles_id = 23;

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

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

【讨论】:

  • 感谢您的回答:))
【解决方案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”之类的查询上获得最佳性能

【讨论】:

  • 感谢@Tiberiu 添加这个答案:))
  • 关于你的语法 KEY id_article_user (id_article, id_user) 为什么你使用id_article_user而不是id_article
  • 因为这是一个组合索引。如果我将其命名为 id_article,开发人员会认为这是 id_article 列上的索引,这是不正确的。
【解决方案3】:

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

【讨论】:

  • 克里斯上述的方式并不要求用户发布文章来表达对文章的“喜欢”。当编写错误代码时,基于 FK 绑定关系的方式很好:)。也许为他添加一个例子来模拟它;)
猜你喜欢
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 2013-08-22
  • 2012-12-25
  • 1970-01-01
相关资源
最近更新 更多