也许你需要三张桌子
- 事件库
- 事件实例
- 对于重复事件的实际实例
- 仅在用户尝试查看该月/周/日等时创建实例。
- 仅当实例在该日期不存在时才创建实例
- 有一个原始日期和当前日期(如果这个实例可以移动)
- event_reoccurrence 表
- 带有结束日期字段。如果结束日期为空,则没有结束日期。
这是一个示例 event_instance 表架构
- event_base_id
- event_reoccurrence_id(如果没有再次发生,则为 null)创建事件的规则。
- original_created_for_date(如果用户移动实例,它不会重新添加到原始日期)
- current_date(它显示在日历上的日期
- location_override
- 持续时间覆盖
- 其他覆盖等
这是一个示例 event_reoccurrence 表模式(重复规则)
- event_reoccurrence_id
- event_base_id(无符号整数)
- day_of_week varchar(20)
- day_of_month varchar(20)
- day_of_year varchar(20)
- week_of_month varchar(20)
- week_of_year varchar(20)
- 月份_of_year varchar(20)
- 年varchar(20)
- lastdate_of_reoccurrence日期
#2 - #8 中的值可以是单个数字、范围“2-6”、以逗号分隔的数字或 null。
- null 表示不相关(无论该值如何,事件都可能发生)
- 某个数字:事件发生在该日期与该数字匹配的日期
- weekday: 5 = 事件不能在星期五以外的日子发生
- 以逗号分隔的数字:当任何数字现在匹配时发生事件
- 月:2、4、5 = 事件可能发生在 2 月、4 月和 5 月
- 范围:事件发生在范围之间
- 一个月中的几天:1-12 = 事件可以在每个月的 1 日到 12 日发生
- 当每个非空字段匹配时,事件发生在该日期的日期。
因此,如果您检查一个日期并且每个字段都为空或与该日期匹配,那么该事件将在该日期发生。也许每个事件可以有多个条目来构建复杂的模式。
每月的一周将是前 7 天,而不是第一个星期日。如果 week_of_month 是 3 并且星期几是 2,并且除了事件 ID 之外的所有其他内容都为空,这就像每个月的第三个星期二。
然后当该人查看日历时,您针对该月的每一天请求所有重复发生的事件,并为每个匹配的事件创建实际事件