问个问题,顶、文章、用户的关系是如保存的?(内有例子)

2013-12-04 14:50:28 +08:00
 androidBrant
举个例子,糗事百科每个帖子都有顶这个功能,但每个人只能顶一次,那顶的人,和帖子的关系是如何保存的(数据库如何设计的?)?
2700 次点击
所在节点    程序员
7 条回复
raincious
2013-12-04 14:58:42 +08:00
猜想类似于

SELECT `t`.`topic`, `like`.`liked` FROM `topic` AS `t`
LEFT JOIN `liked` AS `like` ON `like`.`topicID` = `t`.`topicID` AND `like`.`likerID` = %CURRENTUSERID%

然后每次顶好了,liked表里面加一条什么的。

当然这样数据库负担很大,或许需要拆成两个SELECT然后在程序里合并结果什么的。当然,拆来来之后,都能直接上NOSQL了。
spoony
2013-12-04 14:59:03 +08:00
Token+Postid 的Hashtable
hustlzp
2013-12-04 15:16:13 +08:00
一张表,2个field:user_id, post_id。

然后主键设为user_id+post_id的组合。

这样应该就保证一个人只能顶一篇文章一次。
mechille
2013-12-04 15:32:25 +08:00
提供个思路(没实际操作过,欢迎拍砖):在POST表建一个字段post_user。

里边存入user的id,半角逗号分割。

下次直接用find_in_set判断当前这个user是否存在于这个post的post_user里就可以了
ayang23
2013-12-04 16:01:40 +08:00
@mechille 几千个id组成字符串对mysql的io也有不少影响,而且程序还得处理,效率不一定比left join好
mechille
2013-12-04 16:08:36 +08:00
@ayang23 那么三楼方案应该是最佳的了。插入用REPLACE INTO 或者 INSERT INTO ... ON DUPLICATE KEY UPDATE。检索用 substring_index 做关系(应该比like效率高吧)
slixurd
2013-12-04 23:45:40 +08:00
2楼的hashtable显然更好啊,如果不需要查看是谁顶帖的情况下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/91777

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX