0

介绍

您好,我花了很多时间研究为即将到来的项目中的重复事件找到合适的解决方案。我以前处理过事件和重复事件,但我从未找到或开发出我喜欢的解决方案。所以我正在考虑为 CakePHP 构建一个插件来处理复发。

我有两个用例,我想将此插件/类用于:

  1. 重复事件 - 日历或列表视图
  2. 定期付款 - 有时我不想使用网关定期付款,或者我想通知即将付款等

我相信还有很多其他用例,但这是我最常遇到的两个,实际上数据库模式和基本源代码应该是相似的,如果不能在各种用例之间完全重用的话,无论如何。

所以我需要帮助的是确定用于重复事件的适当数据库模式。我有两个想法,我认为每个都有其优点和缺点,但需要确定灵活性、可维护性和性能的最佳整体方法。

因此,在任一解决方案中,我都需要能够添加、编辑、删除和列出事件。我希望能够通过编辑或删除事件发生的所有日期或特定日期的选项来编辑重复事件。我想有类似谷歌日历的重复规则/选项。每天,每周,每月,每年等选项。

第一个想法

一张名为 events 的表来存储重复发生的事件。在这种方法中,我需要解析重复选项并基本上循环并根据重复选项创建一个单独的事件。例如,如果我想创建一个名为“每周会议”的事件,开始日期为 2012 年 1 月 1 日,结束日期为 2012 年 12 月 31 日,每周一发生,我将在事件表中创建 52 条记录。我认为这种方法更难管理编辑和删除,并且保存事件需要更长的时间,但列出数据应该像查询日期范围一样简单。如果您必须更改该事件的重复发生,这可能是一场噩梦。

CREATE TABLE `events` (                                                               
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,                                      
      `parent_id` int(10) unsigned NOT NULL,                                              
      `start_date` datetime NOT NULL,                                                     
      `end_date` datetime NOT NULL,                                                       
      `title` varchar(150) CHARACTER SET latin1 NOT NULL,                                 
      `description` text CHARACTER SET latin1,                                            
      `created` datetime NOT NULL,                                                        
      `modified` datetime NOT NULL,                                                       
      PRIMARY KEY (`id`)                                                                  
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

第二个想法

有多个表来处理重复。这将消除编辑和删除问题,保存也应该更快,但我认为查询数据以获取事件会很复杂(认为 mysql 查询会很复杂)而且速度更慢。我应该提到,这个系统将读取远远超过写入事件。但我想要一个可以重复使用的通用解决方案。我还可以使用缓存来改善阅读,所以这不是一个大问题。使用上面的示例而不是 52 个条目,我们将在事件表中只有一个。

不确定确切的架构有什么想法吗?

提前感谢您的帮助和想法!想了解其他人如何处理重复发生的事件。

4

1 回答 1

1
CREATE TABLE `events` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `parent_id` int(10) unsigned NOT NULL,
    `title` varchar(150) CHARACTER SET latin1 NOT NULL,
    `description` text CHARACTER SET latin1,
    /** Some fields about how the recurring is applied  **/
   `created` datetime NOT NULL,
   `modified` datetime NOT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `event_occurrences` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `event_id` int(10) unsigned NOT NULL,
    `date` DATE NOT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

如果重复的详细信息、开始或结束字段没有更改,则不需要弄乱 event_occurrences。当修改这些细节中的任何一个DELETE FROM event_occurrences WHERE event_id=?,然后有一个方法会为给定的事件 id 生成 event_occurrences。相同的方法可用于创建和修改。

于 2012-07-27T17:42:49.510 回答