postgresql - 可以创建外键以指向 PostgreSQL 中日期范围版本表中的非唯一列吗?
问题描述
我想在 PostgresSQL 中做两件事:
- 按日期范围对表格中的行进行版本化
- 通过设置单列外键确保表的完整性
对我来说,似乎我只能同时做以上其中一项。
详细示例:
我需要根据日期范围对表格的内容进行版本化(因此在任何特定时间点, ( customId
, validFrom
, validUntil
) 唯一索引只有一行(没有重叠范围)。但重要的是这些都不是列本身是唯一的。
通过使用这种方法,我可以查询我的表并获取任何时间点的有效实体,但我无法弄清楚如何通过customId
密钥将此表链接到另一个表,以便保护表的完整性。
问题是customId
键不是唯一的,因为当记录多个范围时,可能有多个相同的键。
我以前使用的一种解决方案是在我只对实体的最新状态感兴趣时创建另一个x_history表,并且每次都将旧状态复制到历史表中,但是这一次,这不会很好,因为我会不断查询两个表,因为它是“随机”的,我在选择过程中对什么版本的数据感兴趣。
数据示例:
表一:
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
是唯一的
解决方案
您不能轻易地同时拥有外键和历史数据。
一种方法是将有效范围作为主键的一部分,但是当您修改引用表中的条目时,您必须更新许多行。
我认为如果您在历史记录表中包含当前活动的版本,您可以摆脱历史记录表。然后你可以只查询历史表,具有当前值的表就在那里用于外键。
历史表将对主键和时间范围有一个排除约束。
推荐阅读
- javascript - 使用 AngularJS ng-bind 字段从网页中抓取数据的 Chrome 扩展代码
- kotlin - Kotlin 返回 Null 不能是非 null 类型的值
- java - 我应该在哪里保存我的文件在 Android 中以供本地访问?
- session - 如何删除 TYPO3 中的会话?
- php - 使用 PHP PDO 根据之前的选择动态更新下拉列表
- tensorflow - 张量流模型的类似 Keras 代码
- java - Java 控制器在实时服务器上给出 404 错误
- javascript - 从数组中计算信息时,实际结果为 -1
- parallel-processing - 有没有一种可能的方法来为黄瓜 4 并行执行创建一些全局步骤挂钩?
- c# - 如何为我的画布存储非持久的图像数组以从中获取背景?