2010-03-20 66 views
3

我正在研究一個需要我實施日曆的項目。我試圖想出一個非常靈活的系統:可以處理重複事件,重複例外等。我已經查看了iCal,Lotus Notes和Mozilla等應用程序的模式,以瞭解如何去實施這樣一個系統。目前,我無法決定什麼是處理重複事件異常的最佳方法。我已經使用了很多數據庫,但沒有豐富的經驗來真正優化所有內容,所以我不確定我認爲哪兩種方法在整體性能和查詢/搜索能力方面都是最優的:如何最好地處理重複日曆事件的異常

  1. 打破重複事件。因此,爲重複事件改變當前行的結束日期,插入一個新行,並添加另一行,繼續舊序列。
  2. 只需添加一個例外。因此,添加一個新行,並將其指定爲一個覆蓋字段。

所以這是爲什麼我不能決定。方法一將導致更多的行,因爲每個編輯需要2個額外的行,而第二個方法只需要一行。另一方面,我認爲查詢事件會非常簡單,因此使用第一種方法可能會更快(?)。第二種方法好像需要在應用程序服務器上進行更多計算,因爲一旦獲取了數據,就必須刪除兩行的交集。我知道數據庫往往是網站的瓶頸,雖然我相信很多人都認爲或者沒有問題,因爲你的項目可能永遠不會足夠大,以使效率的差異真的很重要,但我仍然希望實施最佳方案。那麼你們會選擇哪種方法,或者你會做一些完全不同的事情?

另外,作爲備註,我將使用MySQL和PHP。如果您認爲另一種技術更適合於此,尤其是在數據庫領域,請提及它。

感謝您的意見。

回答

0

我已決定只輸入一行,並使用代碼將它們從重複集中移除。在我完成它之前還需要一段時間,但我會盡量記住在完成所有工作後,在這裏發佈一些性能結果。

0

事件不是永久性的,可能會發生變化或終止。

你應該插入一行事件的每個日期,在編輯重複事件,給編輯或只是一個事件的所有實例的選項。

當你這樣做時,你應該只需要一個額外的字段來指示事件是否激活。

正確編制索引時,這對您的查詢沒有太大的影響。

一個例子是:

SELECT * FROM events WHERE event_id = 123 AND active = 1; 

在這種情況下,你會被要求指數事項標識和積極的列。

+0

活動意味着什麼?因爲說你有一個重複的事件,但你不希望它在某一天重複。保存事件應該重複的數據的行仍處於活動狀態,並且添加的異常也將處於活動狀態。總之,數據庫中的每一行都是活動的......如果沒有必要,它就會被刪除。 – blcArmadillo 2010-03-20 04:45:18

+0

活動表示該活動將在該日期發生(未取消,重新安排時間,沒有重複的例外情況)。 如果您在每個星期六但不在2010年6月19日發生了「火災」事件,那麼您將在事件「觸發」的每一天插入行並將該日期標記爲非活動狀態。 它不應該被刪除,因爲有些東西可能會改變,並且您希望該事件也會在該日期觸發,而不是添加新事件,您只需編輯現有的事件並啓用該日期即可。 – Andre 2010-03-20 04:59:45

+0

我現在看到。我並沒有打算爲每天的事件創建一個條目,而是讓我的代碼可以輕鬆地列舉出來並找出這些日子。舉例來說,你有一個重複的事件永遠......你不能添加無限數量的行到你的數據庫。我確實看到你現在的意思。感謝您的澄清。 – blcArmadillo 2010-03-20 05:09:55