モハマド:
私のテーブルは、このようなものです:
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
一度だけ。それはあなたの意味liked
とfavorited
列が値のどちらか持っています0
か1
。
したがって、この設定は許容可能です。
しかし、ユーザーがすでにそれをポスト「を気に入っ」とし、「お気に入り」したときに、あなたのロジックは、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
気に入っやお気に入りに登録しました行の存在を検知します。