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检测到喜欢或收藏的行的存在。
TA贡献1804条经验 获得超8个赞
可能不是。最重要的是,您会丢失谁支持或喜欢特定帖子的信息。当有人取消喜欢或喜欢时,这使得跟踪“撤回”变得很困难。
您也无法知道一个人有多少点赞/点赞。有人是支持一切的天使吗?还是一个脾气暴躁的人?
此外,维护列需要更新行。更新通常比添加新行更昂贵。这只是在高容量期间的问题,此时可能存在对相同数据页的争用。insert
s 的争用要少得多。
在某些情况下,这种方法可能很好。不过,作为一般规则,我认为作为一般规则,将喜欢和赞成的表格分开,更合适。
TA贡献1786条经验 获得超13个赞
我会创建两个不同的表。
一张喜欢/不喜欢的桌子和一张收藏的桌子。
例子:
favorites | -> user_id -> post_idlikes: | -> user_id -> post_id -> like->boolean -> dislike->boolean
通过这种方式,您始终可以跟踪什么是什么,并且更易于使用。如果你在一张桌子上同时做这两件事,它会变得更加复杂。如果事情很容易,为什么要让它变得困难?设置需要更多的工作,但最终你会很高兴你将它们分开。
- 3 回答
- 0 关注
- 91 浏览
添加回答
举报