我正在制作一个问题和答案网站类似雅虎答案。它将有一个积分系统,用户可以对答案进行投票,但我不知道是否应该删除用户在某个主题上获得的积分(如果它被删除的话)票)。这引出了我的主要问题:最好的方法是什么?
我创建了一个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会这样做,但他们有一个更先进的系统。
答案 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}}表是正确的。
关于在删除问题时修改用户积分是否“合乎逻辑”的问题,这是您的偏好,因为您是实施网站逻辑的人。 :)