0

所以这就是我想要做的:

我有许多事件,每个事件代表一个日期时间范围(如 07.03.2014 06:00 - 07.03.2014 08:00)事件关联(一对多)到hall_schedule.

然后我想搜索所有hall_schedule's没有覆盖某个特定时间范围的事件,例如:

“我想要大厅活动不涵盖 07.03.2014 06:00 - 07.03.2014 08:00 范围的所有 hall_schedules”

那么问题来了,为了获得最佳性能,我该如何设计呢?存储事件并稍后进行描述的搜索的最佳方式是什么?

我很乐意使用特定于 postgresql (9.3) 的东西,只要能提供最佳性能

4

1 回答 1

4
  1. 使用TIMESTAMP WITH TIME ZONEforhall_schedule和时间startend
  2. 用于tstzrange检测重叠,例如:

    SELECT *
      FROM "hall_schedule"
     WHERE NOT (tstzrange("start", "end", '[]') &&
                tstzrange(:input_start, :input_end, '[]'))
    

笔记:

  • 如果需要,您可以将整个范围存储在表中的tstzrange列中hall_schedule,但是从应用程序中编辑更难(您必须在任何地方提供其文本表示)
  • 这样,如果需要,您实际上也可以创建EXCLUDE约束,以防止事件hall_schedule相互重叠。

更新:

此外,为了加快查询速度,您还可以添加以下索引:

CREATE INDEX "hall_schedule_range_idx"
          ON "hall_schedule"
       USING gist ((tstzrange("start", "end", '[]')));
于 2014-03-07T13:04:27.907 回答