确保连接表中开始/结束日期的唯一性

问题描述 投票:0回答:1

假设 PostgreSQL 数据库有三个表,

users
entities
connections
,其中后者是一个连接表,用于跟踪哪些用户连接到哪些实体(因此它具有预期的
user_id
entity_id
列)。

用户可以与一个实体有多个(过去的)连接,我想跟踪这些连接,但应该只允许他们有一个“活动”连接。我所说的“活跃”是指当前时间在 connections.valid_from

connections.valid_to
之间(或类似的时间 - 如果有更好的方法来建模,我洗耳恭听)。如果任何用户/实体组合都不允许重叠时间段,那也是更好的选择。
我当然可以确保在应用程序级别满足这些约束,但我更愿意在数据库级别做到这一点。

我的理解是,在唯一索引中使用

now()

是不可能的,所以我猜我需要更高级的东西,比如触发器?

对这样的东西进行建模的最佳方法是什么?

postgresql database-design
1个回答
0
投票

tsrange

 列。 
范围有很多内置运算符,这使得检查重叠变得容易,例如&&。然后
对任何重叠的时间戳范围添加排除约束
CREATE TABLE connections ( ... valid_during tsrange not null, EXCLUDE USING GIST (valid_during WITH &&) );

	
© www.soinside.com 2019 - 2024. All rights reserved.