我想在网站上建立一个系统,允许用户根据他们的评级做一些事情。例如,我有评级值X的规则:
对于评级值Y,规则可能如下:
每晚我都会重新计算用户的评分,因此我知道每个用户能够做些什么。 可能不会对每个评级的重新计算进行求和或重置。
更重要的是,管理员可以随时填写具体用户的可能性。
什么是所需的最佳数据库(MySQL)结构?
我可以算一下具体用户做了什么:
SELECT COUNT(*) FROM posts WHERE UserID=XXX AND DateOfPost >= 'YYY'
SELECT COUNT(*) FROM comments WHERE UserID=XXX AND CommentOfPost >= 'YYY'
但是在这种情况下如何管理填充可能性呢?
答案 0 :(得分:1)
我会记录每个用户每天的操作次数,并使用该表进行比较。
此表格包含以下字段:
检查规则: 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
如果他的评分发生变化,结果仍然有效(您只需与其他总数进行比较)
创建规则表时:
您可以查询以下权限:
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)
如果在用户表中有三列名为remainingPosts
,remainingComments
和remainingVotes
?当用户执行特定操作时,您将减少列,这样管理员就可以“重新填充”这些列,甚至高于原始限制。
===
另一个选项是将权限的过期存储在这些列中,以便您可以重置权限,只需将某个列的到期时间设置为前一天。然后,您可以使用您的查询来获取用户的剩余帖子/评论/投票数。
答案 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)。