我從頭開始建立日曆系統(要求,因爲我正在與Gregorian一起使用特殊類型的日曆),並且我需要一些邏輯幫助。我正在用Django和Python編寫應用程序。在日曆中重複「事件」:CPU vs數據庫
本質上,我遇到的邏輯問題是如何儘可能保持儘可能少的對象,而不會在CPU週期上運行選項卡。我感覺多態會成爲解決這個問題的方法,但我不確定如何在這裏表達它。
我有兩個基本的事件子集,重複事件和一次性事件。
重複事件將有訂戶,通知他們的變化的人。例如,如果一個班級被取消或搬到不同的地址或時間,那麼已訂閱的人需要知道這一點。有些事件每天都會發生,直到時間結束,不會被編輯,並且「恰好發生」。問題是,如果我有一個對象存儲事件信息及其重複策略,那麼取消或修改系列中的一個事件真的會搞砸了,我必須以某種方式解決這個問題,讓訂閱者意識到改變並保持這個系列作爲一個邏輯組合。
悖論:爲系列中的每個正常事件生成唯一事件對象,直到時間結束(如果它無限期地重複),如果它們都將存儲相同的信息,則無意義;然而,如果系列中的單個事件發生任何更改,我幾乎會已有在數據庫中創建一個不同的對象來表示取消。
有人可以幫我用這裏的邏輯嗎?它真的扭曲了我的想法,我不能再真正地思考了。我真的很想就如何解決這個問題提供一些建議,因爲重複事件並不是最簡單的邏輯事件(每隔一天或每M/W/F重複一次,或每個月的第一個M,或者每3個月或每年一次,或這一天的每週一次,或這一天的每月一次,或週二的上午9:00和週四的上午11點等),我會就像幫助理解重複事件的最佳邏輯路線一樣。
下面是關於如何做到這一點思想:
class EventSeries(models.Model):
series_name = models.TextField()
series_description = models.TextField()
series_repeat_policy = models.IHaveNoIdeaInTheWorldOnHowToRepresentThisField()
series_default_time = models.TimeField()
series_start_date = models.DateField()
series_end_date = models.DateField()
location = models.ForeignKey('Location')
class EventSeriesAnomaly(models.Model):
event_series = models.ForeignKey('EventSeries', related_name="exceptions")
override_name = models.TextField()
override_description = models.TextField()
override_time = models.TimeField()
override_location = models.ForeignKey('Location')
event_date = models.DateField()
class EventSeriesCancellation(models.Model):
event_series = models.ForeignKey('EventSeries', related_name="cancellations")
event_date = models.TimeField()
cancellation_explanation = models.TextField()
這似乎使了一點感覺,但如上所述,這是毀了我的大腦,現在,所以,只要看起來像它會工作。 (另一個問題和問題是,如果有人想修改系列中剩下的所有事件,我該怎麼做!?!?我想我可以更改'series_default_time',然後爲所有過去的實例生成異常實例以設置它們原來的時間,但AHHHHHH !!!)
沸騰它歸結爲三個簡單的,具體的問題,我們有:
- 怎樣纔可以有一系列重複的事件,但允許取消和修改個別事件和作爲一個整體對系列的其餘部分進行了修改,而在絕對必要時將少量對象存儲在數據庫中,絕不會爲單個事件生成對象提前?
- 如何以一種高度可定製的方式重複事件,而不會失去理智,因爲我可以允許事件在number of ways中重複,但再次使事情變得簡單並儘可能少地存儲對象?
- 我怎麼能做到以上的,允許在每個事件系列交換機使,如果它掉下來一個holiday它不會發生呢?
+1爲罕見但有用的類:models.IHaveNoIdeaInTheWorldOnHowToRepresentThisField – mjhm
我經常使用該字段的方式。 –