我有四个主表-
1.user(user_id, name,...)
2. post(post_id, description, ...)
3.comment(comment_id,user_id,comment,...)
4.reply(reply_id,user_id, reply,...)
和
5.user_post(user_id,post_id)
6.post_comment(post_id,comment_id)
现在,用户可以为每个评论,回复和发布提供1到10分(类似于评分),我还需要计算用户通过其内容(发布,评论,回复)获得的总分。目前,我有两种选择。
选项1:
我可以有一个名为points
的大表,并使用type
列来存储每个内容的点数,这会牺牲referential integrity
例如-
points(content_id, type, point, given_by)
OR
选项2:
具有三个不牺牲referential integrity
的表。例如-
post_point(post_id, point, given_by)
comment_point(comment_id, point, given_by)
reply_point(reply_id, point, given_by)
那么,这里最好的和将来的解决方案是什么?或者有没有更好的解决方案?谢谢。
答案 0 :(得分:1)
无论选项1还是2,当用户访问帖子时,您需要汇总所有子点,这会花费很多。
假设选项2,您可以这样做:
SELECT SUM(point) FROM post_point where post_id=100
如果有成千上万的用户对该帖子发表意见,则该声明可能需要几秒钟才能回复。
我建议在user / post / comment / reply表中再增加1个点列,
用户(用户ID,名称,...)→用户(用户ID,名称,点,...)
post(post_id,description,...)→post(post_id,description, point ,...)
...
每次用户/帖子/评论/回复将任何要点添加到相关要点中。
例如,帖子100获得1点,您可以在帖子表中添加1点:
UPDATE post SET point=point+1 WHERE post_id=100;
如果要跟踪或显示给定的用户,还可以在post_point表中添加1个点。
INSERT INTO post_point VALUES('100','1','...');
高效的地方是当有人查看此帖子时,您只能通过1条SELECT语句显示要点。