管理Q& A网站上的用户点

时间:2012-05-18 01:04:49

标签: php mysql points

我正在制作一个问题和答案网站类似雅虎答案。它将有一个积分系统,用户可以对答案进行投票,但我不知道是否应该删除用户在某个主题上获得的积分(如果它被删除的话)票)。这引出了我的主要问题:最好的方法是什么?

我创建了一个points表,每当用户获得积分时,它都会记录在points表中,然后从users表中的总数中添加/减去它。

但是,如果一个问题被删除,我将如何设法减去所获得的积分(并添加以低票数丢失的积分)?

points表的结构是(我刚刚进行了SHOW CREATE TABLE points查询):

CREATE TABLE `points` (
 `pid` int(11) NOT NULL AUTO_INCREMENT,
 `point_user` int(11) NOT NULL,
 `question_id` int(11) NOT NULL,
 `timestamp` int(25) NOT NULL,
 PRIMARY KEY (`pid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

users表:

CREATE TABLE `users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `uid` int(11) NOT NULL,
 `fname` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
 `lname` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
 `username` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
 `password` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `confirm_key` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
 `email` varchar(80) COLLATE utf8_unicode_ci NOT NULL,
 `user_pic` varchar(300) COLLATE utf8_unicode_ci NOT NULL,
 `user_title` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
 `moderator` varchar(5) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'false',
 `deleted` varchar(4) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'no',
 `suspended` varchar(4) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'no',
 `points_count` int(11) NOT NULL DEFAULT 0,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

我只是不知道删除/回复问题上获得/丢失的分数是否被删除是否是一个好主意。

我知道Stack Overflow会这样做,但他们有一个更先进的系统。

4 个答案:

答案 0 :(得分:1)

我的想法是,仅仅因为行政改变,花时间回答问题的人仍然赢得了...只是我的意见 - 我可能是错的。

答案 1 :(得分:1)

如果删除,我会提出返回点。

users上,我建议您进行两项更改:

`moderator` tinyint(1) COLLATE utf8_unicode_ci NOT NULL DEFAULT 0,
`deleted` tinyint(1) COLLATE utf8_unicode_ci NOT NULL DEFAULT 0,
`suspended` tinyint(1) COLLATE utf8_unicode_ci NOT NULL DEFAULT 0,

我认为tinyint在这种情况下优于varchar

我还要在你的points表中添加id user {+ 1 /}这个问题+ 1 / -1,以便在需要提供积分时跟踪用户回来。

答案 2 :(得分:1)

我相信用户仍然应该在发送帖子的时间内获得奖励。如果您的用户组认为答案值得进行评选,则用户仍应“受到惩罚”。请记住,答案/问题网站中的积分系统是此类网站的决定因素。

话虽如此,如果你仍然打算在已删除帖子上获得点数的用户返回/获取积分,这是在SQL中执行此操作的方法

SELECT u.user_id, SUM(//points awarded)
FROM points p
JOIN users u ON p.point_user = u.user_id
Group By p.point_user

答案 3 :(得分:1)

如果您想在删除问题时删除积分,我可以想到的一种方法是使用database trigger

points表上执行DELETE语句时可以触发触发器,然后使用适当的重新计算更新users表,确保total列中的users列{{1}}表是正确的。

关于在删除问题时修改用户积分是否“合乎逻辑”的问题,这是您的偏好,因为您是实施网站逻辑的人。 :)