【问题标题】:What is your data model for recurrent event?您的经常性事件数据模型是什么?
【发布时间】:2021-01-19 23:22:35
【问题描述】:

例如谷歌日历,我们可以:

  • 添加简单事件
  • 添加重复事件
    • 每周一次
    • 每周一/周二
  • 删除重复事件的实例
  • 更改所有后续重复事件

我有一个events,例如主要事件“Event#1”及其实例“Event#2”和“Event#3”,它们具有主要事件的 event_id 外键,例如1

你怎么看?我应该以某种方式使用 iCal 规范吗?

【问题讨论】:

  • 您使用的是什么数据库?有些人比其他人有更好的时间支持。 iCal 规范可能对即将出现的各种日历问题最有用。
  • 我使用 PostgreSQL
  • 你很幸运,它有很棒的日期/时间设施。 Timestamp ranges 特别有用。但是,日历很难。有关您打算做什么的更多信息将有助于回答。

标签: ruby-on-rails database data-modeling


【解决方案1】:

两个关键:

  • 将活动与其日程分开。
  • 将重复计划定义与其单独的计划分开。

通过将事件与其日程表分开,重复事件的实例可以共享相同的事件信息,例如其描述和位置,而其他实例可以使用经过编辑的版本。

events:
  id
  name
  description
  location
  ...

通过将重复计划与其单独的计划分开,查询事件变得更加简单。

recurring_event_schedules:
  id
  event_id
  schedule: jsonb
  start_at: timestamp with time zone

这是一个活动的定期安排。

定期安排变得复杂。您可以为每种类型的重复周期(每年、每两年、每天、每月、每周等)创建多个表,或者使用jsonb 来存储规范。每个工作日的规格可能是{ "period": "weekly", "days": [1,2,3,4,5] }。参考 iCal 规范和优秀的日历软件,了解您想要的重复事件类型和其他属性。

jsonb 不是万能的,但此表仅供参考,用于生成和更新事件。它不用于运行时查询。为此,还有第二张桌子。

然后从中生成单独的计划事件,直至可配置的限制。

event_schedules:
  id
  event_id
  recurrent_event_schedule_id
  schedule: tztsrange

这张表很简单。它是根据什么事件、时间和重复计划生成的。

由于您使用的是 Postgres,而不是单独的开始/结束字段,因此请使用 timestamp rangespecial operators 支持这些,以确定时间是否在范围内,或者范围是否重叠,等等。

Rails will accept Range types,但不直接支持运算符。例如,EventSchedule.where("duration @> ?::date", Date.new(2014, 2, 12)) 查找 2014 年 2 月 12 日发生的所有事件。

如果您要编辑单个已安排的事件,请复制其事件,对其进行编辑,然后将 EventSchedule 链接到该新事件。

如果您想更改周期性活动时间表,请按recurrent_event_schedule_id 选择event_schedules。

如果您想更改所有预定事件的事件,请编辑链接到 RecurringEventSchedule 的事件。


通过这种方式,您可以定义复杂的重复事件并查询简单的具体事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2017-03-15
    • 1970-01-01
    • 2018-06-13
    • 2011-04-06
    • 2011-12-30
    • 2017-07-13
    相关资源
    最近更新 更多