用于行版本控制的RDBMS主键设计

时间:2015-07-21 00:29:48

标签: sql primary-key rdbms primary-key-design

我想用行版本控制为我的表设计主键。我的表包含2个主要字段:ID和Timestamp,以及一堆其他字段。对于唯一的“ID”,我想存储以前版本的记录。因此,我创建表的主键是ID和时间戳字段的组合。 因此,要查看特定ID的所有版本,我可以给出,

Select * from table_name where ID=<ID_value>

要返回最新版本的ID,我可以使用

Select * from table_name where ID=<ID_value> ORDER BY timestamp desc

并获得第一个元素。 我的问题是,这个查询是否有效并且在O(1)中运行而不是扫描整个表以获得所有匹配相同ID的条目,因为ID字段是主键字段的一部分?理想情况下,为了得到O(1)中的结果,我应该提供整个主键。如果它确实需要进行整个表扫描,那么我如何设计我的主键以便在O(1)中完成此请求?

谢谢, 斯利拉姆

1 个答案:

答案 0 :(得分:2)

关于此主题的规范参考是数据库中的有效时间戳https://www.cs.arizona.edu/~rts/pubs/VLDBJ99.pdf

我通常使用仅包含主键的表,使用包含该主键的另一个引用表以及具有适当默认值的change_user,valid_from和valid_until列来设计本文建议的子集。这使得引用完整性变得容易,以及将来的值插入和历史保留。如果您将这些字段公开给应用程序以进行直接修改,请考虑适当的索引,并考虑检查约束或触发器以防止重叠和间隙。这些都有明显的性能开销。

然后我们制作一个暴露给开发人员的“当前值视图”,并且也可以通过“代替”触发器插入。