2010-09-28 81 views
0

我有一个包含事件信息的MYSQL表。我需要一种机制,根据它的日期更新每个事件的状态(如果它过去的日期是“over”)。 做这样的事情最好的办法是什么?更新任何用户登录时的事件状态(对大多数用户而言无用的例程),创建某种内部任务(如cron作业?)或任何其他方式。 现在,只有当创建者登录时,事件的状态才会更新。这可以工作,但是另一个用户会将事件视为“已计划”,直到创建者登录,即使日期已过。顺便使用PHP。谢谢根据日期自动更新MYSQL表

+1

当请求事件时更新它。 – 2010-09-28 13:48:01

+2

日期是唯一的标准?那你为什么要更新任何东西?使用一些日期算术代替例如比较日期值与现在()。 – VolkerK 2010-09-28 15:27:23

+0

这是一个很好的观点,但应用程序严重依赖于事件状态,因此不断比较日期不是一种选择。如果状态仅被请求了几次,这将是有意义的。根据要求更新是一个选项。我感谢你们俩。 – JoaoPedro 2010-09-28 15:52:38

回答

1

我建议任何时候状态请求时更新状态。或者更好的是,根本不要将状态存储在数据库中,而只是根据其他变量在每次请求时计算它。这样,无论何时你有一个表格列表状态或某人请求状态,只需将事件日期,与今天的日期进行比较,并将它们发送到“未开始”,“正在进行”或“结束”。

除非你需要更多可能的状态(“计划”,“准备”,“设置”等)。然后,您需要为这些状态中的每个状态计划日期/时间,否则您需要存储状态变量。无论哪种方式,您都可以在请求时更新状态(根据当天的日期和任何其他相关信息)。

+0

根据要求更新是绝对要走的路。不将数据存储在数据库中会使一切变得更加复杂。列出过去的事件是应用程序中的常见任务,每次请求列表时都需要进行大量处理。有很多事情取决于事件的状态。不过谢谢。 – JoaoPedro 2010-09-28 23:13:13

+0

@JoaoPedro,根据事件状态存在“太多东西”的事实并不一定证明在DB中存储额外的数据是正确的 - 实际上恰恰相反;大多数数据库系统都是I/O绑定的,这意味着他们正在等待数据被读取和写入存储器,并且向混合中添加额外的不必要和非常便宜的可计算列将通常减慢(!)系统。对于单个领域(加上索引)而言不是太多,但如果作为一个原则来使用,那么它会叠加起来。 – Unreason 2011-01-31 15:37:53

0

在用户登录时更新并不是一个好主意,因为它增加了太多的压力(如果有很多用户)。做到这一点的最佳方式是在上午12点以后或每天开始时每天晚上运行cronjob。如果你仍然想保留你的旧代码,然后用日期代码包装它。 伪看起来像:

$updated_last = last modification time of the file "updated"; 
if($updated_last is more than 1 day) { 
update db; (your old code) 
touch file "updated"; 
} 
+0

我认为cron工作不会这样做,因为活动状态可能会被请求,并在事件创建后的几个小时内更改为“over”。谢谢 – JoaoPedro 2010-09-28 23:18:06

+0

@JoaoPedro“事件状态可能会被请求,并在事件创建后的几个小时内变为”结束“。这不正确的操作?基于日期的状态,午夜状态会改变,还是我错过了什么? – Jaydee 2010-09-29 08:15:12

0

使用此,

UPDATE events SET status = 'over' WHERE DATE(event_date) > NOW(); 

运行它的每一天,每天一次,用cron

0

除非你必须处理很多时区,否则我会选择午夜cron作业。重新计算似乎相当浪费,并且从维护角度来看,按需计算可能会变得相当混乱,因为它会使数据库处于部分不正确的状态。

0

每个答案接受你的更新理由。 但是,让我质疑这个决定,并延续了Srapnel上校的意见。

更新可以被视为浪费资源,因为您可以在内存日期比较(这比存储器的I/O更快的数量级)上计算它。

有两种方法可供选择:

  • 查询/视图可以做到这一点(和成本确实应该忽略不计)
  • 其实这样做对PHP端结果检索后(认为这是一个格式/演示任务)
  • 它甚至可以在客户端,其中如果可能的话,性能方面将是最好的解决方案做了(这可能导致维护/安全问题)

当然,可能存在忽略这些解决方案的正当理由,但我认为其本身的性能还不够(大多数数据库都是I/O绑定的)。