mysql - Timekeeper MySQL-结构

标签 mysql timer

我正在尝试制作一个计时器并考虑一个好的数据库结构。

想法如下: 在前端(例如网站、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/

相关文章:

mysql - 如何为 MySQL 中的字段或列设置别名?

JavaScript 定时器

vb.net - 如何创建运行时 timer.tick 事件?

java - Java中的脉冲图像按钮

meteor - 在 Meteor 中与 React 一起使用 setInterval

php - 显示与数据库字段不同的值

mysql - App Engine 和 MySQL

asp.net - 如何在 asp.net 中存储参数以便与 sql 一起使用?

php - 在 Linux 上使用 PHP 启用 LOCAL INFILE

c# - 当系统处于休眠状态时,Windows 服务中的计时器如何运行?