1

我正在制作一个类似于 Yahoo Answers 的问答网站。它将有一个积分系统,用户可以在其中对答案进行投票,但我不知道我是否应该删除用户在某个主题上获得的积分,如果它被删除(如果他们有任何问题,我应该把被删除的积分加回去票)。这引出了我的主要问题:最好的方法是什么?

我制作了一张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

4 回答 4

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,

我认为tinyintvarchar这种情况要好。

而且我还会在您的points表格id上添加user+1/-1 的问题,以便您可以在需要返还积分时跟踪用户。

于 2012-05-18T01:27:03.297 回答
1

如果您想在删除问题时删除分数,我能想到的一种方法是使用数据库触发器

您可以在对表执行 DELETE 语句时触发触发器points,然后users使用适当的重新计算更新表,确保表中的totalusers正确。

对于如果删除问题是否“合乎逻辑”修改用户点的问题,这是您的偏好,因为您是实施网站逻辑的人。:)

于 2012-05-18T01:57:20.797 回答
1

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

于 2012-05-18T01:25:01.133 回答
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
于 2012-05-18T01:41:58.097 回答