基本上,我遇到的逻辑问题是如何尽可能聪明地持久化尽可能少的对象,而不会在CPU周期上花费太多。我感觉多态性可能是解决这个问题的方法,但我不确定如何在这里表达它。
我有两个基本子集事件,重复事件和一次性事件。
重复事件将有订阅者,即被通知其更改的人。例如,如果班级被取消或移至不同的地址或时间,则已订阅的人需要知道此事。有些事件每天都会发生,直到永远不会被编辑,只是“发生”。问题是,如果我只有一个存储事件信息及其重复策略的对象,那么取消或修改系列中的一个事件会导致混乱,我必须以某种方式解决这个问题,使订阅者知道更改并将系列保持为逻辑组。
Paradox:对于一个重复事件,生成每个普通事件的唯一对象直到时间结束(如果它无限重复)是没有意义的,因为它们都将存储相同的信息;然而,如果系列中发生任何更改,我几乎必须创建一个不同的对象在数据库中表示取消。
有人能帮我理清这里的逻辑吗?这真的让我困惑,我不能很清晰地思考。我真的需要一些关于如何解决这个问题的意见,因为重复事件并不是最容易解决的逻辑问题(每隔一天重复,或每周一/三/五,或每月的第一个星期一,或每3个月,或每年一次在这个日期,或每周一次在这个日期,或每月一次在这个日期,或在周二上午9:00和周四上午11:00等),我需要帮助理解重复事件的最佳逻辑路线。
以下是一种处理方法的想法:
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',然后为所有过去的实例生成异常实例,将它们设置为原始时间,但啊啊啊啊啊啊!!!)
归纳为三个简单、具体的问题,我们有: