我想在PostgresSQL中做两件事:
对于我来说,我似乎只能同时执行上述一项操作。
我需要根据日期范围对表的内容进行版本控制(因此,在任何特定时间点,{customId
,validFrom
,validUntil
仅存在一行)唯一索引(不存在重叠范围),但重要的是这些列本身都不是唯一的。
通过使用此方法,我可以查询我的表并获取任何时间点的有效实体,但是我不知道如何通过customId
键将此表链接到另一个表,因此该表的完整性桌子守着。
问题在于,customId
键不是唯一的,因为当记录多个范围时,一个键可能不止一个。
我以前使用的一种解决方案是,当我只对实体的最新状态感兴趣时,创建另一个 x_history 表,并每次将旧状态复制到历史表中,但这一次,因此效果不佳,因为我会不断查询两个表,因为这是“随机”的,我在选择过程中感兴趣的数据版本。
表 a :
id
(PK)custom_id
(通过上述综合唯一索引在任何单个时间点都是唯一的)valid_from
(时间戳,存储 a 的有效性的开始)valid_until
(时间戳,存储 a 的有效期结束)表 b :
id
(PK)a__custom_id
(在任何单个时间点都是唯一的)valid_from
(时间戳,存储 b 的有效性的开始)valid_until
(时间戳,存储 b 的有效期结束)我只想将这些行插入表 b 中,其中
b.a__custom_id
存在于a.custom_id
b.a_custom_id
,b.valid_from
,b.valid_until
是唯一的答案 0 :(得分:0)
您不能轻易同时拥有外键和历史数据。
一种方法是将有效范围作为主键的一部分,但是每当修改引用表中的条目时,都必须更新许多行。
如果您在历史记录表中包含当前处于活动状态的版本,我认为您可以摆脱历史记录表。然后,您只需查询历史记录表,就可以在其中找到具有当前值的表以获取外键。
历史记录表将在主键和时间范围内具有排除约束。