Vla*_*ich 0 sql postgresql postgresql-9.3
所以这就是我想做的:
我有许多事件,每个事件代表一个日期时间范围(如 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) 特有的东西,无论什么都能提供最佳性能
TIMESTAMP WITH TIME ZONEforhall_schedule和时间start点endSELECT *
FROM "hall_schedule"
WHERE NOT (tstzrange("start", "end", '[]') &&
tstzrange(:input_start, :input_end, '[]'))
Run Code Online (Sandbox Code Playgroud)笔记:
tstzrange中的一列中,但从应用程序中进行编辑会比较困难(您必须在任何地方提供其文本表示形式)hall_scheduleEXCLUDE约束,以防止事件hall_schedule相互重叠。更新:
此外,为了加快查询速度,您还可以添加以下索引:
CREATE INDEX "hall_schedule_range_idx"
ON "hall_schedule"
USING gist ((tstzrange("start", "end", '[]')));
Run Code Online (Sandbox Code Playgroud)