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

非规范化。

  • 有一张表,上面有喜欢和不喜欢的东西(哪个项目做了什么)
  • 在 items 表上有一个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]

A UNIQUE KEYonlikes_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 回答