是否可以创建外键以指向PostgreSQL中日期范围版本表中的非唯一列?

时间:2018-10-03 16:56:10

标签: postgresql foreign-keys database-relations

我想在PostgresSQL中做两件事:

  • 表格中按日期范围排列的版本行
  • 通过设置单列外键确保表的完整性

对于我来说,我似乎只能同时执行上述一项操作。

详细示例:

我需要根据日期范围对表的内容进行版本控制(因此,在任何特定时间点,{customIdvalidFromvalidUntil仅存在一行)唯一索引(不存在重叠范围),但重要的是这些列本身都不是唯一的。

通过使用此方法,我可以查询我的表并获取任何时间点的有效实体,但是我不知道如何通过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_idb.valid_fromb.valid_until是唯一的

1 个答案:

答案 0 :(得分:0)

您不能轻易同时拥有外键和历史数据。

一种方法是将有效范围作为主键的一部分,但是每当修改引用表中的条目时,都必须更新许多行。

如果您在历史记录表中包含当前处于活动状态的版本,我认为您可以摆脱历史记录表。然后,您只需查询历史记录表,就可以在其中找到具有当前值的表以获取外键。

历史记录表将在主键和时间范围内具有排除约束。