我正在尝试制作一个计时器并考虑一个好的数据库结构。
想法如下:
在前端(例如网站、Java 应用程序等)上,您可以创建一个具有特定名称的计时器。
为了让计时器保持运行,即使您关闭前端,我想到了一个表,它可以保留开始时间(作为日期时间)。
如果停止计时器,开始时间和结束时间之间的差值将是总花费时间。
到目前为止一切顺利。
但我还想添加继续计时器的可能性。
所以我想到了有两张 table 。
一个用于保存总时间(包含“名称”和“花费的时间”列),另一个用于保存每个“开始-停止”操作。
因此,如果您创建一个新计时器,它将在第一个表中创建一个包含名称的新行,并在第二个表中创建一个包含开始时间的新行。
如果您随后停止计时器,则会计算时间差,并且将更新第一个表(花费的时间 = 差值)(通过使用过程)。
因此,如果您重新启动/继续计时器,它应该在第二个表中再次创建一个新行,并通过停止来再次更新第一个表(所花费的时间 = 所花费的时间 + 差异)。
现在的问题是: 这是一个好方法吗?我是否错过了什么,或者有人对此有更好的主意吗?
最佳答案
第一个表不应有 timeSpent 列,因为这可能与第二个表中的实际时间不同步(考虑发生多次启动/停止且表被覆盖的竞争条件)。
我确实喜欢你关于拥有父表和子表的想法。我建议如下:
计时器表
- 身份证
- 姓名
持续时间表
- 身份证
- Timer_id(定时器的外键)
- 开始时间
- 结束时间
您的总时间将是每个 end_time - start_time 的计算结果。像这样的东西会很好用:
SELECT SEC_TO_TIME(time_milis / 1000)
FROM (
SELECT SUM(UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time)) as time_milis
FROM table
)
总结一下,不要在行中保存任何计算值 - 这不是一个好的做法,并且可能导致表不同步,尤其是在竞争条件下。利用良好的外键关系并将其规范化。
有了这样的两个表,如果有人关闭并重新打开计时器,您就可以获取重新生成历史记录所需的所有信息。我认为这个模式应该可以很好地为您服务。
关于mysql - Timekeeper MySQL-结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32468328/