如果你愿意储存更多的数据,我就建议这一设计。
相反,不要每次打上点(强视游戏的“状态”),而是储存各方所采取的一切行动。 顺便提一下:
id | playerid | action | stamp
----+----------+----------+------------------------
1 | 1 | e2 to e4 | 2011-10-27 04:00:00-04
2 | 1 | | 2011-10-27 04:30:00-04
3 | 1 | | 2011-10-27 06:00:00-04
4 | 1 | | 2011-10-27 07:45:00-04
5 | 1 | | 2011-10-27 08:00:00-04
等等。
e2至e4是指以行方式移动的支票,这是共同的开端行动之一。 你的游戏,我确实可以设计。 然而,“行动”是任择性的,你实际上只需要储存一项行动来计算惩罚。 (只要你当然有这样做的余地,也可以储存额外信息。)
“id”是本案的关键。 在Pogresql,DDL希望:
CREATE TABLE actions(
id BIGSERIAL PRIMARY KEY,
playerid int,
action text,
stamp timestamptz,
UNIQUE(playerid, stamp));
理论(互动、研究)将是“真实”的主要关键。 “id”是代号钥匙。
看到时间序列的差异,使用窗口功能的代码相对简单。 (继续使用邮政局)
select playerid, time_between, id FROM
(SELECT playerid,
stamp - lag(stamp) OVER () as time_between,
id FROM actions
ORDER BY stamp)
as ss
WHERE playerid = 1
AND time_between > 1 hour ;
样本产出,考虑到先前的测试数据:
playerid | time_between | id
----------+--------------+----
1 | 01:30:00 | 3
1 | 01:45:00 | 4
你们根本就没有工作。 你们储存更多的数据(因此,“undo”行动更容易。 如果愿意,你们的参与者可以审查过去的行动。 如果计算惩罚措施效率不高,那么你总是能够把记分放在更高的水平上。
MySQL btw没有温饱功能。 但可在邮政总局、服务器和Oracle查阅。
EDIT:如果空间是令人关切的问题,那么你总是可以“垃圾收集”这一表格。 尽管如此,这还是有很多游戏。 每一行各占约48英特(假定“行动”无效)。 如果你有1,000名运动员,每家游戏200次,有40次行动,则只有大约384个数据元。