将重复事件添加到非重复表

时间:2012-10-01 15:17:57

标签: php mysql

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

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

因此,如果用户为每月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并将事件表中的条目添加到新事件中。)

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

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

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

1 个答案:

答案 0 :(得分:0)

我正在考虑2个表格用于活动,其他一些表格用于参与者和重复。 1个表保存事件“模板”,另一个表保存实际事件实例,并且可能保持第3个以跟踪重复发生。

  • event_defaults
    • ID
    • EVENT_NAME
    • event_duration(INT秒)
    • 位置
  • default_participants
    • USER_ID
    • event_defaults_id(foriegn key to event_defaults.id,never NULL)
    • (user_id和events_default.id之间的双主键)
  • event_recurrence
    • foriegn key to event_defaults.id
    • recurrence_unit(日,周,月,季,年的ENUM)
    • recurrence_multiplier(INT表示要重复多少天,几周,几个月)
    • 起始日期
    • recur_until
  • 事件
    • event_id的
    • defaults_id(对event_defaults.id的foriegn键,可能为NULL)
    • 名称
    • start_time(时间戳)
    • end_time(时间戳)
    • 位置
  • 参与者
    • USER_ID
    • event_id(foriegn key to events.id)
    • (user_id和events.id之间的双主键)

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

当事件重复发生时,您可以删除 event_defaults 中的条目,并保留事件中发生的事件的记录。你可以让kron在这么多天后将这些人解析出来,将它们存档到另一个表中,或者甚至在事件表上维护一个已经过期的事件的分区。

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

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

此外,您的kron作业可以创建最多recur_until或.... 10年的新事件?无论你决定什么任意间隔。 Prolly不是一个好主意,可以为重复活动创建实例,直到时间结束。