0

似た/似ていない機能を実装する必要があるプロジェクトでは、パフォーマンスの観点から、どのアプローチが他のアプローチよりも優れているかを知りたいです。挿入削除を使用する必要がある場合、誰かがそれを何度も好き/嫌いにするとどうなりますか(おそらく、主キー番号のほとんどは、好き/嫌いに基づいて占有されます)?
誰かがソーシャルネットワーキングサイトがそれをどのように行うか知っていますか?

編集:
私のテーブルは以下の通りです:

CREATE TABLE `junc_user_share_like` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `jusid` int(10) unsigned NOT NULL,
 `liker` mediumint(8) unsigned NOT NULL,
 `when` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`),
 UNIQUE KEY `jusid` (`jusid`,`liker`),
 KEY `liker` (`liker`),
 CONSTRAINT `junc_user_share_like_ibfk_1` FOREIGN KEY (`liker`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `junc_user_share_like_ibfk_2` FOREIGN KEY (`jusid`) REFERENCES `junc_user_share` (`jusid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

編集2:
あなたが最後の更新で言ったように、これは私が推測したものです:

INSERT INTO likes SET jusid=$jusid, liker=$liker
UPDATE junc_user_share SET likes=likes+1 WHERE id=$id

これはいいねには最適ですが、誰かが自分のいいねを元に戻したい場合はどうなりますか?いいねからレコードを削除する必要がありますか?私の問題はまさにここにありますか?ここで何をしますか?

4

1 に答える 1

0

非正規化。

  • 好き嫌いのあるテーブルを持っている(どのアイテムに何をしたか)
  • likesアイテムテーブルにとフィールドがunlikesあり、どちらも0で始まります

好き/嫌いなこと(1 =好き、0 =好きではないと仮定)

INSERT INTO likes_unlikes SET item=[id of item], user=[id of user], action=[0|1];
UPDATE items SET likes=IF([action]=1,likes+1,likes), unlikes=IF([action]=0,unlikes+1,unlikes) WHERE id=[id of item]

UNIQUE KEYオンはあなたにプレゼントとしてのlikes_unlikes(item,user)ユニークさを与えます。

編集

話し合った後、好きなものはあるが嫌いなものがない場合、状況はさらに簡単になります。

  • likesアイテムとユーザーIDを持つテーブルのみが必要です
  • likesアイテムテーブルにはフィールドのみが必要です

クエリは次のようになります

INSERT INTO likes SET item=[id of item], user=[id of user];
UPDATE items SET likes=likes+1 WHERE id=[id of item]

のようなものの逆転のために:

DELETE FROM likes WHERE item=[id of item] AND user=[id of user];
UPDATE items SET likes=likes-1 WHERE id=[id of item]
于 2012-07-18T07:58:54.520 に答える