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

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

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

Select * from table_name where ID=<ID_value>

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

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

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

谢谢, 斯里拉姆

最佳答案

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

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

然后,我们创建一个向开发人员公开的“当前值 View ”,并且也可以通过“而不是”触发器插入。

关于sql - 用于行版本控制的 RDBMS 主键设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31528488/

相关文章:

python - 如何使用 python 解析 nestead json 并从 dict 值构造关系数据库列

sql - 使用有限的数据估算每个标签(或标签组)每月的页面浏览量?

sql - 在 MS SQL Server 中使用 truecrypt

primary-key - 如何在clickhouse的主键中使用 `toYYYYMMDD(timestamp)`

go - 从 gorm 模型创建主键时出现问题

hadoop - 从RDBMS批量导入到Hadoop

java - 如何使用java将日期和时间发送到SQL

c# - 具有多个where参数的linq to sql查询

sql - 链接表是否需要无意义的主键字段?

sql-server - 如何解决 "Batch update returned unexpected row count from update; actual row count: 0; expected: 1"问题?