2009-09-21 31 views
4

我開始使用SQLAlchemy一個新的項目,我正打算實施類似提出這個quiestions的一個審計線索:允許用戶從數據庫審計跟蹤回滾與SQLAlchemy的

正如我已經有「有趣」的對象的完整歷史,我想在允許用戶回滾到一個給定的版本,讓他們擁有無限undo的可能性。

用SQLAlchemy以乾淨的方式可以做到這一點嗎?

什麼是正確方式在內部API(業務邏輯和ORM)公開此功能?

我是沿着user.rollback(ver=42)的方式。

回答

7

雖然我還沒有使用的SQLAlchemy具體而言,我可以給你,可以在任何ORM可以輕鬆實現的一般提示:

  • 分離出的版本控制的項目爲兩個表,說DocumentDocumentVersionDocument存儲不會在版本間更改的信息,DocumentVersion存儲確實會更改的信息。
  • 給每個DocumentVersion一個「父」參考。爲同一個表創建一個外鍵,指向文檔的以前版本。
  • 通過將參考Document更新爲「當前」版本,回滾到以前的版本。不要刪除鏈條底部的版本。
  • 當他們在回滾後創建新版本時,它將創建另一個版本分支。

例如,創建A,B,C,回滾到B,創建d,E:

(A) 
| 
(B) 
| \ 
(C) (D) 
    | 
    (E) 
+0

的允許分支是很酷,但它不會是真的真的很難做到向下合併馬路? – voyager 2009-09-23 20:23:09

+1

這不像源代碼控制。從用戶的角度來看,您完全刪除了C,您將永遠不需要將其合併到其中。它仍然存在的唯一原因是作爲審計線索,或者出於某種原因需要手動刪除已刪除的項目。 – 2009-09-29 20:12:17