为了账号安全,请及时绑定邮箱和手机立即绑定

在同一个表中添加收藏夹、喜欢/不喜欢和视图(观看过的帖子)是一个好习惯吗?

在同一个表中添加收藏夹、喜欢/不喜欢和视图(观看过的帖子)是一个好习惯吗?

PHP
30秒到达战场 2022-10-28 09:42:10
我的桌子是这样的: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个单独的桌子?
查看完整描述

3 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

大概每个不同的user_id人只能“喜欢”或“喜欢”每个不同post_id的人一次。这意味着您的liked和favorited列具有值0或1。


所以这个设置是可以接受的。


但是,当用户已经“喜欢”了一个帖子然后“收藏”它时,你的逻辑将比你有两个单独的表更复杂。使用单独的表格,当用户“喜欢”一个“帖子”时,您所要做的就是INSERT IGNORE一行。当用户“不喜欢”某个帖子时,您所要做的就是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检测到喜欢或收藏的行的存在。


查看完整回答
反对 回复 2022-10-28
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

可能不是。最重要的是,您会丢失支持或喜欢特定帖子的信息。当有人取消喜欢或喜欢时,这使得跟踪“撤回”变得很困难。

您也无法知道一个人有多少点赞/点赞。有人是支持一切的天使吗?还是一个脾气暴躁的人?

此外,维护列需要更新行。更新通常比添加新行更昂贵。这只是在高容量期间的问题,此时可能存在对相同数据页的争用。inserts 的争用要少得多。

在某些情况下,这种方法可能很好。不过,作为一般规则,我认为作为一般规则,将喜欢和赞成的表格分开,更合适。


查看完整回答
反对 回复 2022-10-28
?
开满天机

TA贡献1786条经验 获得超13个赞

我会创建两个不同的表。

一张喜欢/不喜欢的桌子和一张收藏的桌子。

例子:

favorites
  |
   -> user_id   
   -> post_idlikes:
  |
   -> user_id   
   -> post_id   
   -> like->boolean   
   -> dislike->boolean

通过这种方式,您始终可以跟踪什么是什么,并且更易于使用。如果你在一张桌子上同时做这两件事,它会变得更加复杂。如果事情很容易,为什么要让它变得困难?设置需要更多的工作,但最终你会很高兴你将它们分开。


查看完整回答
反对 回复 2022-10-28
  • 3 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信