同じテーブル内/嫌いとビュー(見た記事)のように、お気に入りを追加することをお勧めますか?

モハマド:

私のテーブルは、このようなものです:

CREATE TABLE `views` (
  `user_id` int(11) UNSIGNED NOT NULL,
  `post_id` int(11) UNSIGNED NOT NULL,
  'liked' tinyint(1) NULL DEFAULT NULL,
  'favorited' tinyint(1) NULL DEFAULT NULL,

  PRIMARY KEY (`user_id`,`post_id`)
) ENGINE=InnoDB

これは、パフォーマンスとクエリ数を削減するための良い方法ですか?3つの別々のテーブルを持っているか、そのより良いですか?

O.ジョーンズ:

おそらく各個別user_id「のような」缶または「お気に入り」毎に異なるpost_id一度だけ。それはあなたの意味likedfavorited列が値のどちらか持っています01

したがって、この設定は許容可能です。

しかし、ユーザーがすでにそれをポスト「を気に入っ」とし、「お気に入り」したときに、あなたのロジックは、2つの別々のテーブルを持っていた場合よりも複雑になります。別々のテーブルでは、すべてのユーザーが「好き」と、「ポスト」はしなければならないINSERT IGNORE行。ときにあなたがしなければならないユーザー「unlikes」ポストすべてがあるDELETE行。それは良い常に、クリーナーやソーターコードになります。

あなたは必要ありませんTINYINT。この場合には、列を。テーブルの行の存在は、「好き」または指示するために十分である「お気に入りに追加します」。

また、各テーブルには、このような列に投げることができました。

datestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

次に、あなたのアプリで余分なコードで、ユーザーが「気に入った」またはポスト「をお気に入りに登録しました」ときの記録を持っているでしょう。

あなたはこのようなテーブル何かの外にこのようなものを得ることができます。

SELECT user.whatever, post.whatever, 
       CASE WHEN like.user_id IS NOT NULL THEN 'liked' ELSE '' END liked,
       CASE WHEN fav.user_id IS NOT NULL THEN 'favorited' ELSE '' END favorited
  FROM user
  JOIN post
  LEFT JOIN like
        ON user.user_id = like.user_id AND post.post_id = like.post_id
  LEFT JOIN fav
        ON user.user_id = fav.user_id AND post.post_id = fav.post_id
  WHERE user.user_id = WHATEVER
    AND post.post_id = WHATEVER

LEFT JOIN... IS NOT NULL気に入っやお気に入りに登録しました行の存在を検知します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=283657&siteId=1