2

私は、ユーザーがこのテーブル構造で記事を投稿できる Web サイトに取り組んでいます。

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

これはクリスの有効な方法です。を使用して、で表示している現在の記事と表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 に答える
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」というクエリを作成すると、このクエリはインデックスを使用しません。より良いオプションは、結合されたインデックスと、結合されたインデックスの 2 番目の列に別のインデックスを追加することです。このような:

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 に答える
1

合計3つのテーブルがあります。記事テーブル、およびユーザーIDは、記事を送信するユーザーの列になる可能性がありますが、すべてのユーザーが記事を送信するわけではないため(私は推測しています)、別のユーザーテーブルが必要です。ユーザーからの主キーと記事からの主キーを取得し、それらを外部キーとして使用します。記事がいいねされるたびに、3 番目のテーブルにエントリが作成されます。

于 2013-02-19T14:32:30.420 に答える