我想在 PostgreSQL 中存储一些具有打开或关闭状态的任意事件的日期/时间范围以及状态更改的日期/时间。
来自 API 的事件将具有以下单个事件的数据:
Request 1:
{
id: 1,
state: 'open',
date: '2020-02-17T10:00:00Z'
}
Request 2:
{
id: 1,
state: 'close',
date: '2020-02-17T10:10:00Z'
}
Request 3:
{
id: 1,
state: 'open',
date: '2020-02-17T11:00:00Z'
}
请求可以按任何顺序出现,因此未来日期可以在过去日期之前出现,或者状态并不总是打开 -> 关闭 -> 打开 -> 关闭。例如,API 可以一个接一个地发送同一事件的打开状态。
我正在考虑使用tstzrange
以下形式将这些数据保存在数据库中:
CREATE TABLE events (
id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
event_id int,
validity tstzrange
);
打开状态在有效性列中捕获,关闭状态是有效性列之间的间隙。例如,如果单个事件按此顺序具有以下状态和日期/时间(为简单起见仅使用时间):
state date/time
close 20:30
open 18:00
close 16:00
open 15:00
open 20:00
close 19:30
有效性行应如下所示:
id event_id validity
1 1 [15:00, 16:00)
2 1 [18:00, 19:30)
3 1 [20:00, 20:30)
Event 1
有状态open
之间15:00 - 16:00
,状态close
之间16:00 - 18:00
,状态open
之间18:00 - 19:30
等等。
为了直观地说明这一点:
我的问题是事件没有按顺序出现,所以我不知道如何操纵各个有效性列来插入/更新这些行。