2

我在尝试什么!

我正在使用 jquery、php 和 mysql 制作活动日历。创建的事件存储在 mysql 数据库中,然后取回并显示在日历中。事件包含开始和结束日期。如果用户想要创建一个重复一周的事件,那么他可以使用日历的循环属性并将循环结束日期设置为从事件开始一周。

我被封锁的地方!

假设用户需要一个不会像生日一样结束的重复事件或每周重复的每周事件。在这种情况下,我认为将每个事件插入数据库多年并不是一个好方法。让我们再举一个例子,用户创建了 2 年的每日重复事件。在这里,数据库将变得非常丰富。

我在寻找什么!

有人可以为我提供一些关于如何管理没有结束日期或结束日期很长的重复事件的想法。

4

1 回答 1

0

也许你需要三张桌子

  • 事件库
    • 带有事件、名称、地点、持续时间和详细信息等。
  • 事件实例
    • 对于重复事件的实际实例
    • 仅在用户尝试查看该月/周/日等时创建实例。
    • 仅当实例在该日期不存在时才创建实例
    • 有一个原始日期和当前日期(如果这个实例可以移动)
  • event_reoccurrence 表
    • 带有结束日期字段。如果结束日期为空,则没有结束日期。

这是一个示例 event_instance 表架构

  1. event_base_id
  2. event_reoccurrence_id(如果没有再次发生,则为 null)创建事件的规则。
  3. original_created_for_date(如果用户移动实例,它不会重新添加到原始日期)
  4. current_date(它显示在日历上的日期
  5. location_override
  6. 持续时间覆盖
  7. 其他覆盖等

这是一个示例 event_reoccurrence 表模式(重复规则)

  1. event_reoccurrence_id
  2. event_base_id(无符号整数)
  3. day_of_week varchar(20)
  4. day_of_month varchar(20)
  5. day_of_year varchar(20)
  6. week_of_month varchar(20)
  7. week_of_year varchar(20)
  8. 月份_of_year varchar(20)
  9. varchar(20)
  10. 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 之外的所有其他内容都为空,这就像每个月的第三个星期二。

然后当该人查看日历时,您针对该月的每一天请求所有重复发生的事件,并为每个匹配的事件创建实际事件

于 2013-12-20T19:09:28.497 回答