[英]RDBMS primary key design for row versioning
我想使用行版本控制為我的表設計主鍵。 我的表包含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
並獲得第一個元素。 我的問題是,此查詢是否有效並且可以在O(1)中運行,而不是掃描整個表以考慮到ID字段是主鍵字段的一部分來獲取所有匹配相同ID的條目嗎? 理想情況下,要在O(1)中獲得結果,我應該提供整個主鍵。 如果確實需要進行整個表掃描,那么我還能如何設計主鍵,以便在O(1)中完成此請求?
謝謝,Sriram
關於此主題的規范參考是數據庫中的有效時間戳記 : https : //www.cs.arizona.edu/~rts/pubs/VLDBJ99.pdf
我通常使用本文建議的子集進行設計,使用僅包含主鍵的表,以及具有該鍵以及具有適當默認值的change_user,valid_from和valid_until列的另一個引用表。 這使引用完整性變得容易,並且可以增加將來的值和保留歷史記錄。 如果您將這些字段暴露給應用程序以進行直接修改,請適當地建立索引,並考慮檢查約束或觸發器以防止重疊和空白。 這些都有明顯的性能開銷。
然后,我們制作一個“當前值視圖”,該視圖向開發人員公開,並且也可以通過“代替”觸發器插入。
為此,使用“歷史記錄表”模式要容易得多,而且效果更好。
create table foo (
foo_id int primary key,
name text
);
create table foo_history (
foo_id int,
version int,
name text,
operation char(1) check ( operation in ('u','d') ),
modified_at timestamp,
modified_by text
primary key (foo_id, version)
);
創建觸發器以在更新或刪除時將foo行復制到foo_history。
https://wiki.postgresql.org/wiki/Audit_trigger_91plus以獲得postgres的完整示例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.