需要高效的mysql数据库架构来存储点/等级

时间:2019-01-14 09:43:01

标签: php mysql database

我有四个主表-

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)

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

1 个答案:

答案 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语句显示要点。