我正试图找到一种有效的方法来存储一周内的停电时间范围信息。我今天正在存储这样的一切:
create table access_restriction (
id serial primary key,
user integer references user(id),
weekday integer not null, # ISO-8601 week day
start time not null,
end time not null,
);
因此,每当我必须检查用户是否被允许做某事时,我从那里选择所有内容并在应用程序代码上执行逻辑。使用PostgreSQL有更好的方法吗?
答案 0 :(得分:1)
使用现有结构,您可以将逻辑放在sql:
中SELECT CASE WHEN COUNT(1) > 0 THEN true ELSE false END AS is_blacked_out
FROM access_restriction a
WHERE usr = :input_user_id
AND weekday = :input_weekday
AND start_time = (SELECT MAX(start_time)
FROM access_restriction
WHERE usr = a.usr
AND weekday = a.weekday
AND start_time <= :time_to_check
)
AND end_time >= :time_to_check
有三个输入参数:
您可以将其更改为存储的函数。您需要检查边界条件(ex是end_time
是否包含?)和假设,例如没有为用户配置重叠边界。
对于其他数据结构,您可以想象一个表示一周中时间的位图和一个将输入时间转换为位图的函数,该位图将与用户的中断位图“一起”。但这可能有点过分,而且实际上取决于用户数量,停电时间的粒度,停电时间变化的频率等等。