具有重复事件的数据库的优化设计

时间:2011-01-08 15:55:54

标签: php mysql cakephp

我想创建一个php日历应用程序。如果我想创建正常,每周,每月和每年的活动,该软件的最佳数据库设计是什么?

2 个答案:

答案 0 :(得分:4)

我只想为事件的每次重复创建一个条目,直到某个视野。但是,这意味着如果他们扫描超过您的地平线日期,您将需要另一个表格来预测日期。也就是说,你需要一个事件表,其中包含每次重复事件发生时的一条记录(1月1日,1月8日,1月15日,...到12月),以及一个表,每条记录可用于播种未来年份(开始)日期:1月1日;重复:7;通过:2011)以便在2012年初(或用户请求查看2012+月份时),您可以生成未来事件。

这有两大缺点:

  1. 您的数据库有一整年的数据。但是,如果添加一整年的数据会破坏您的性能,那么您的系统可能功能不足。 (似乎要求日历应用程序能够处理多年的日期)
  2. 在活动期间结束时,您需要为重复活动生成未来日期。
  3. 优势(IMO)超过了劣势:

    1. 显示日历时更容易数学。使用上面的Tim方法,如果用户加载2011年12月18日,您将如何计算当天应该放置哪些重复事件?每次显示日期时,您都将被迫循环遍历每个重复的事件。权衡是缺点#1,我认为这是更好的解决方案,必须重做这些计算。
    2. 您可以编辑活动的特定实例。使用Tim的方法,如果某个假期开会并且用户将其更改为前一天,您甚至会怎么做?使用此处描述的每个事件一个条目的方法,您可以只修改该事件的记录,轻松地在日历中移动单个事件。

答案 1 :(得分:0)

您可以在EVENT表中找到RECURRENCE_STATUS的列,该列可跟踪4个值,不会重复,每周,每月,每年。对当天事件的查询将是那些设置为当天发生的事件的联合,并且不会与那些重复的事件的集合重复,并且其初始日期与今天的差异是对于周,月和日的模0。一年的差异。日期数学计算比那更微妙(因为月份的天数不同),但结构应该足够了。