【问题标题】:Recurring Events Plugin for CakePHP/PHP and MySQL database schemaCakePHP/PHP 和 MySQL 数据库模式的重复事件插件
【发布时间】:2012-07-28 01:42:49
【问题描述】:

简介

您好,我花了很多时间研究为即将到来的项目中的重复事件找到合适的解决方案。我以前处理过事件和重复事件,但我从未找到或开发出我喜欢的解决方案。所以我正在考虑为 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 个条目,我们将在事件表中只有一个。

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

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

【问题讨论】:

    标签: php mysql cakephp schema recurrence


    【解决方案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。同样的方法可以用于创建和修改。

    【讨论】:

      猜你喜欢
      • 2020-03-02
      • 2018-10-16
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      相关资源
      最近更新 更多