我有四个主表

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)


要么,

选项2:
具有三个不牺牲referential integrity的单独表。例如。-

post_point(post_id, point, given_by)
comment_point(comment_id, point, given_by)
reply_point(reply_id, point, given_by)


那么,这里最好的和将来的解决方案是什么?还是有更好的解决方案?谢谢。

最佳答案

无论选项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语句显示要点。

关于php - 需要高效的mysql数据库架构来存储点/等级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54178933/

10-11 17:34