假设 PostgreSQL 数据库有三个表,
users
、entities
和 connections
,其中后者是一个连接表,用于跟踪哪些用户连接到哪些实体(因此它具有预期的 user_id
和entity_id
列)。
用户可以与一个实体有多个(过去的)连接,我想跟踪这些连接,但应该只允许他们有一个“活动”连接。我所说的“活跃”是指当前时间在 connections.valid_from
和
connections.valid_to
之间(或类似的时间 - 如果有更好的方法来建模,我洗耳恭听)。如果任何用户/实体组合都不允许重叠时间段,那也是更好的选择。我当然可以确保在应用程序级别满足这些约束,但我更愿意在数据库级别做到这一点。
我的理解是,在唯一索引中使用
now()
是不可能的,所以我猜我需要更高级的东西,比如触发器?
对这样的东西进行建模的最佳方法是什么?
列。范围有很多内置运算符,这使得检查重叠变得容易,例如
&&
。然后对任何重叠的时间戳范围添加排除约束。
CREATE TABLE connections (
...
valid_during tsrange not null,
EXCLUDE USING GIST (valid_during WITH &&)
);