2012-07-27 71 views
0

介紹

你好,我已經花了很多時間好一點的研究發現對即將開展的項目重複事件合適的解決方案。我以前曾與事件和經常性事件合作過,而且我從未找到或開發過我喜歡的解決方案。所以我正在考慮爲CakePHP構建一個插件來處理重複。重複活動插件的CakePHP/PHP和MySQL數據庫架構

我有兩個用例,我想用這個插件/類:

  1. 重複活動 - 日曆或列表視圖
  2. 循環付款 - 有時我不想使用網關經常性支付或我想要做即將到來的付款通知等

我相信還有很多其他用例,但這些是我遇到最頻繁的兩個,實際上數據庫架構和基本源代碼應該是類似的如果不完全無論如何,在各種用例之間可重用。

所以我需要幫助的是決定合適的數據庫模式用於重複發生的事件。我有兩個想法,我認爲每個想法都有其優點和缺點,但需要以靈活性,可維護性的最佳整體方法來解決。

所以在任何一種解決方案中,我都需要能夠添加,編輯,刪除和列出事件。我希望能夠編輯定期事件,並可選擇編輯或刪除事件發生的所有日期或特定日期。我想有類似谷歌日曆的重複規則/選項。像每天選項,每週,monthy,每年等

一是理念

一個表稱爲事件存儲的重複事件。在這種方法中,我需要解析循環選項並基本循環,並根據循環選項創建個別事件。例如,如果我想創建一個名爲「Weekly Meeting」的活動,開始日期爲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個條目,我們在事件表中只有一個。

不確定任何想法的確切模式?

在此先感謝您的幫助和意見!想要了解其他人如何處理重複發生的事件。

回答

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。同樣的方法可以用於創建和修改。