簡體   English   中英

用於行版本控制的RDBMS主鍵設計

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM