我正在构建一个自定义事件系统,如果你有一个如下所示的重复事件:
活动A从2011年3月3日起每4天重复一次
要么
活动B于2011年3月1日星期二每2周重复一次
如何以一种易于查找的方式将其存储在数据库中.如果有大量事件,我不希望出现性能问题,在渲染日历时我必须经历每一个事件.
我希望能够创建可以基于固定日期执行的日程表,每天重复,在一周中的特定日期重复,在一年中的特定月份重复,在每年的特定日期重复,并在一天的特定时间.
请问我该如何为这个问题构建数据库表?
编辑#1
基本上,我正在编写一个应用程序,允许用户安排在各种预先配置的时间发送预配置的问候语.我知道我需要一个存储有关时间表信息的表格(例如圣诞节,营销一,... |以及时间表应该运行).然后是另一个表,用于记录已运行的计划,发送的问候语,人员和电子邮件; 基本上是一个交易表.
我的问题是设计Schedule表,因为我希望允许用户在特定日期,一周的特定日期(经常性),每个月的特定日期,每天的特定时间以及每年特定的日/月(例如25/12).
如何为计划创建一组表格,以灵活的方式处理这些输入?
我正在构建一个需要存储/管理不同类型事件的系统.为简单起见,我将专注于设计一个日历(我正在构建一些稍微不同的东西,但日历是一个很好的比喻,很容易推理).我想听听可能的数据库/架构设计思路.
问题描述
我有一个包含不同类型事件的日历(为简单起见,假设只有一种类型的事件:任务).用户可以为特定日期添加新事件,编辑(更改某些详细信息,如标题或移至其他日期)或删除.可能存在一次性事件和重复事件(具有不同类型的重复:每X天,每月的第15天,周一的每周;有点像简单的cron).当用户移动重复发生的事件时,此事件的所有其他实例都以相同的方式移动(例如:+3天).重要部分:重复发生的事件可能有例外.因此,举例来说,假设我有一个每7天重复一次的重复事件A. 但是我想改变下周的日期,所以不是星期二,而是分配到星期五,之后它仍然会在星期二发生.移动"父"事件时,不应影响此"异常"事件.
此外,每个周期性事件都可以有其他信息,这只与1个特定实例相关,例如:我有相同的重复事件A每7天重复一次,我想为本周实例添加一条说明"X"的注释,以及我想为下个月的事件添加另一个注释"Y" - 这些字段仅对该单个实例可见.
思路
具有常规一次性事件的系统非常简单,因此我不会讨论这个问题,只关注重复发生的事件.
1.一个可能的解决方案是类似于OOP的一个:我可以有一个Event"类"包含字段,例如start_date,end_date(可null), recurrence_type(有点像用枚举的可能值EVERY_X_DAYS,DAY_OF_WEEK,DAY_OF_MONTH)和recurrence_value(说7).当用户添加新的周期性事件时,我只是Event在数据库中创建这样的事件.当用户想改变1次出现此事件,我的新条目添加到该类型的DB /类MovedEvent,从"继承" Event与不同的日期,并且具有附加字段related_to指向ID(或者UUID,如果你愿意)的Event,它的相关.但在同一时间,我需要跟踪所有的MovedEventS(否则我不得不在同一个星期2个显示事件),所以我需要有一个数组moved_events的IDs表示指向所有MovedEvent秒.
缺点:每次我想显示我需要获取的日历Event并从中选择所有事件moved_events,如果我有很多移动的事件,这不是最佳的.
2.另一个想法是每一个事件存储为一个单独的记录.IMO这是一个可怕的想法,但我只是提到它,因为它是一种可能性.缺点:每次我想编辑主要事件(例如:我想将事件从"每7天"更改为"每9天")我需要更改事件的每一次出现.但是,"异常"(更改单个实例)更容易.
SQL/NoSQL的?缩放细节
我在我的项目中使用PostgreSQL,但我对NoSQL数据库有基本的了解,如果它们更适合这类问题,我可以使用它.
比例:假设我有5k用户,每个人每周平均有150个事件,其中40%可以是"例外".因此,我想设计这个系统是有效的.
类似的问题和其他资源
我刚刚开始阅读Martin Fowler的"日历重复事件"(http://martinfowler.com/apsupp/recurring.pdf),但我不确定它是否适用于我的问题,如果适用,我将如何设计数据库根据本文档的架构(欢迎提出建议).
有类似的问题,但我没有看到任何提及"例外"(更改1个事件实例而不影响其他事件),但也许有人会发现这些链接有用: