设计:多用户审核评论系统

时间:2014-08-23 15:03:00

标签: mysql algorithm web

我正在努力为多个用户(主持人)找到一个很好的解决方案来处理一般评论系统。

我现在有什么 + id,userid,comment,date,status的mysql表

通过选择所有未批准的评论,主持人页面中会显示未批准的评论。一旦主持人查看评论,他们就可以使用适当的按钮批准/删除(这是简单的更改状态或删除语句)。如果只有一个主持人,这可以正常工作。

如果有多个主持人,我该如何确保他们之间的一致性。例如,一旦第一位主持人批准/删除评论,我如何确保从所有其他主持人列表中删除此特定评论。我可以在mysql表上确保每个注释只更改一次,但我不希望多个主持人处理相同的注释(浪费资源;)

1 个答案:

答案 0 :(得分:0)

如果所有主持人需要能够看到所有评论,那么就没有完美的解决方案:如果主持人A和B都看到评论X未批准的评论列表,点击"查看",然后A在B之前批准或拒绝它,然后当B点击"接受"或者"拒绝",必须以某种方式解决冲突。即使您以某种方式强制查看未更新注释列表的所有浏览器会话在更新到达数据库时从服务器端刷新,您最多可以减少发生此类冲突的可能性;总有一个小窗口,B可以点击"接受"或"拒绝"当这不再是一个有效的行动。

你可以:

  1. 在制作时向各个版主指定(例如,随机或通过循环)传入的评论,以便每个评论仅出现在该主持人的列表中,或
  2. 接受主持人点击"查看","接受"或"拒绝"对陈旧的评论,即已被其他主持人接受或拒绝的评论,并适当处理(例如,错误消息,或通过覆盖先前的判决)。
  3. 如果采用方法2,请确保所有数据库操作都在一个事务中进行,并且您可以确定更新是否成功; "检查"初始SELECT,然后只有UPDATE,从那时起,其他东西可以潜入这两个命令之间。 (可以在单个数据库事务中安全地使用单独的SELECTUPDATE命令,但只有在您确定了解数据库使用的并发模型时才这样做;例如,使用PostgreSQL,我相信您需要在通常的FOR UPDATE事务隔离级别中将SELECT添加到原始READ COMMITTED。)

    我建议简单地

    UPDATE comments
    SET status = true
    WHERE userid = ?
    AND id = ?
    AND status = false
    

    最后一行意味着您可以通过检查受影响的行数来检查命令是否实际成功:如果其他主持人在更改之前偷偷摸摸,那么这将是0而不是1。