0

我有一个具有以下结构的表:

event
- id
- date_start
- number_hours
- date_end 
- specialist_id / specialist assigned to this event.

用户选择活动开始的日期和持续的小时数。现在所有这些事件都是非重复的,但我想添加重复事件的可能性。

我怎样才能以精心设计的方式做到这一点?我希望能够扩展这个设计,不仅支持每周和每月的活动,还支持每周日、周六或其他重复类型的活动......谢谢

我在考虑以下问题

事件

- id
- date_start
- recurring / whether the event is recurring or not
- weekly / (if repeats every 1 week, this will be 1, if repeats every 2 weeks, this number will be 2)
- monthly / (if repeats every 1 month, this will be 1, if repeats every 2 months, this number will be 2)
- last_occurred_date / date the event last occurred (if non-recurring, this equals date_start, if recurring, it does not)
- next_occurred_date / date when the event is supposed to occur next.
- specialist_id / what specialist took this event

因此,如果用户添加 2012 年 10 月 1 日的事件,每月重复一次,则将以下条目添加到表中:

date_start: 10/1/2012, recurring: 1, weekly: 0, monthly: 1 (it occurs every 1 month), last_occurred_Date: 10/1/2012, next_occurred_date: 11/1/2012)

而且我有一个 cron 工作,它基本上会遍历所有重复事件(其中 event.recurring = 1 并将条目添加到事件表中以获取即将发生的新事件。)

因此,该活动的下一个日期是 2012 年 11 月 1 日。添加了以下条目:

id: 1 date_start: 11/1/2012 recurring: 0 

我为重复事件发生的每个日期添加一个条目的原因是因为我必须为每个事件分配一个专家。因此,专家会收到带有链接的电子邮件,他们可以在其中注册每个活动。

4

1 回答 1

0

我正在考虑为活动准备 2 张桌子,为参与者和重复准备一些其他桌子。1 个表保存事件“模板”,另一个保存实际事件实例,并且可能是第 3 个来跟踪重复。

  • event_defaults
    • ID
    • 事件名称
    • event_duration(INT 秒)
    • 地点
  • default_participants
    • 用户身份
    • event_defaults_id(event_defaults.id 的外键,从不为 NULL)
    • (user_id 和 events_default.id 之间的双主键)
  • event_recurrence
    • event_defaults.id 的外键
    • 重复单元(日、周、月、季度、年的枚举)
    • 复发乘数(INT,表示要重复多少天、几周、几个月)
    • 开始日期
    • recur_until
  • 事件
    • event_id
    • defaults_id(event_defaults.id 的外键,可能为 NULL)
    • 姓名
    • start_time(时间戳)
    • end_time(时间戳)
    • 地点
  • 参与者
    • 用户身份
    • event_id(events.id 的外键)
    • (user_id 和 events.id 之间的双主键)

这个想法是针对您的重复事件,您在event_defaults表中创建一个条目,并将重复信息创建到event_recurrence中。然后,您创建每个模板的实例作为 events 中的实际事件。然后,用户可以为每个事件定义他想要的一些参与者(默认情况下)。所有一次性事件都直接插入event_defaults.id 的外键为 NULL 的事件中。

当事件重复发生时,您可以删除event_defaults中的条目并保留 events 中发生的事件的记录。您可以让 kron 在这么多天后将这些家伙剪掉,将它们归档到另一个表中,或者甚至可以在事件表上为已过期的事件维护一个分区。

好处是通过保持模板和每个事件的实际实例分开,您可以修改单个事件,同时仍然保持模板相同。例如,本周在某家餐厅而不是办公室会议室举行每周办公室会议。现在,您可以在events中更新相应事件实例的位置,而无需更改每周模板。

此外,您可以为每个事件分配一个默认专家,如果他们出于某种原因需要与其他专家切换,您只需编辑单个事件实例而不是模板。

此外,您的 kron 作业可以创建长达 recur_until 或 .... 10 年的新事件?无论您决定什么任意间隔。在时间结束之前为重复事件创建实例并不是一个好主意。

于 2012-10-01T16:00:39.857 回答