用户在网站上的可能性

时间:2011-01-09 12:14:39

标签: php mysql database-design

我想在网站上建立一个系统,允许用户根据他们的评级做一些事情。例如,我有评级值X的规则:

  • 3天内发帖1次
  • 1天内发表10条评论
  • 2天内20票

对于评级值Y,规则可能如下:

  • 1天内发帖
  • 1天内50条评论
  • 1天内30票

每晚我都会重新计算用户的评分,因此我知道每个用户能够做些什么。 可能不会对每个评级的重新计算进行求和或重置。

更重要的是,管理员可以随时填写具体用户的可能性。

什么是所需的最佳数据库(MySQL)结构?

我可以算一下具体用户做了什么:

SELECT COUNT(*) FROM posts WHERE UserID=XXX AND DateOfPost >= 'YYY'
SELECT COUNT(*) FROM comments WHERE UserID=XXX AND CommentOfPost >= 'YYY'

但是在这种情况下如何管理填充可能性呢?

4 个答案:

答案 0 :(得分:1)

我会记录每个用户每天的操作次数,并使用该表进行比较。

此表格包含以下字段:

  • 日期:行动发生的日期
  • 计数:当天采取的操作数量
  • userId :谁执行了此操作
  • 行动:哪个动作发布/评论/投票/...
  • 忽略:布尔值,如果已设置,则管理员已重置值

检查规则: SELECT SUM(count)FROM log WHERE userId = XXX AND action = YYY AND ignore = 0 AND DATEDIFF(date,NOW())< = DAYS

重置规则: UPDATE ignore = 1 FROM log WHERE userId = XXX

如果他的评分发生变化,结果仍然有效(您只需与其他总数进行比较)

创建规则表时:

  • 作用
  • 限制
  • rating_min
  • rating_max

您可以查询以下权限:

SELECT action, IF(SUM(count) < MIN(limits), 1, 0) as can_do_action FROM log LEFT JOIN rules ON rules.action = log.action WHERE userId = XXX AND rating_min <= RATING AND rating_max >= RATING AND ignore = 0 AND DATEDIFF(date, NOW()) <= days

所以你得到一个这样的表登录:    - comment =&gt; 1    - votes =&gt; 0

您必须每次操作都更新此表(如果当天的第一个操作或更新行的计数,则创建一个新行)

缺少规则意味着没有采取任何行动,因此我们可以忽略它。

答案 1 :(得分:0)

如果在用户表中有三列名为remainingPostsremainingCommentsremainingVotes?当用户执行特定操作时,您将减少列,这样管理员就可以“重新填充”这些列,甚至高于原始限制。

===

另一个选项是将权限的过期存储在这些列中,以便您可以重置权限,只需将某个列的到期时间设置为前一天。然后,您可以使用您的查询来获取用户的剩余帖子/评论/投票数。

答案 2 :(得分:0)

如果我理解正确,您的用户可以发布1个博客,并发表评论10次。现在,他/她已经评论了5次并发布了博客。您希望管理员单击一个按钮,现在用户可以再次发布博客并发表评论10次?

这可能有点像黑客攻击,但您可以计算正在重置/忽略的操作,并从当前操作中减去这些操作?

例如:用户有1个博客和5个评论。管理员按下“重置”,然后保存这些值。 现在,当用户发布另一个博客,并检查是否允许时,您将获得

SELECT COUNT(*) FROM posts WHERE UserID=XXX AND DateOfPost >= 'YYY'

你做这样的事情

SELECT changes FROM adminTable WHERE UserID=XXX AND  type = 'post'

如果计数 - 更改没问题,那就设置好了。

答案 3 :(得分:0)

我建议完全区分这两个问题:

  • 为用户启用功能/可能性的过程
  • 用户功能的数据模型

例如,您可以使用一个简单的多对多表来表示用户功能:

user_features(
   user_id
  ,feature_id
  ,source      (admin|earned)
  ,primary key(user_id, feature_id)
);

这使管理员可以轻松禁用/启用部分或全部功能集。

您的夜间作业将通过在此表中插入/删除来查询相关表格并授予/撤消功能。

如果采用这种方法,您实际上可以根据评级或特定操作提供功能。

诸如“3天内3个帖子”之类的规则可以这样实现:

when a user posts, check if the previous post was made within 24 hours.
if yes then
   increment counter by 1
   record current timestamp

   if counter = 3 then
      grant feature to user
else 
   reset counter to 1 
   record current timestamp

在user_id键入的某些表中,您需要两列(post_count:int,last_post:date)。