Mysql

如何維護數據庫審計?

  • November 29, 2015

我正在使用 MySQL 數據庫(使用 Django ORM)。我想維護類似於 StackOverflow、Quora、Wikipedia 等的數據庫審計。這些網站維護數據庫中更改的修訂,以便使用者/管理員所做的更改可以恢復。

在經歷了StackOverflow的數據庫設計和 Quora 修訂版之後,我明白了兩種方法——

堆棧溢出

創建一個重複的表來保存數據庫中所做更改的日誌。對於每個條目,記錄更改、時間戳和進行此更改的管理員/使用者。使用這些條目來查找差異並恢復到任何點。SO 將修訂歷史保存在單獨的PostHistory表中。

知乎

不要為數據庫中的每個表創建單獨的表,而是為審計創建一個這樣的表。-

  • id - 修訂 ID
  • scope_id - 數據庫表的 id
  • scope_type - 問題、主題、使用者
  • item_id - 數據庫表中 Question/topic/user 的行 id
  • 事件 - 編輯、添加、還原、刪除
  • user_id - 誰觸發了事件
  • 時間戳
  • serialized_item_column - json 格式的序列化數據

然後序列化數據可用於計算差異並恢復特定條目。

在像 wiki/SO 這樣的眾包平台的上下文中,多個使用者/管理員可以進行更改,

  • 兩種數據庫設計哪個更好?
  • 如果我對每個表使用一個重複表進行修訂,即一個用於目前值,一個用於所有以前的修訂,那麼對於具有數百萬條目和更多修訂的網站來說,這是一種可擴展的方式嗎?

站在前人的肩膀上。

如果我使用重複表,對於擁有數百萬條目和更多修訂的網站來說,這是一種可擴展的方式嗎?

“重複表”?計劃 A:一張包含所有修訂的表格。計劃 B:2 個表格,一個包含目前值,一個包含所有以前的修訂。計劃 C(真的很糟糕):每個修訂版一張表。

兩種數據庫設計哪個更好?

一旦你完成了定義“更好”的練習,你就會找到答案的一半。

如果架構更改,如何在基於 json 的審計中更改架構?

這聽起來像是問題的不同維度——跟踪模式更改。這本身就是一項非常艱鉅的任務。JSON 在架構更改時添加/刪除額外的“欄位”沒有問題。但是,如果一個表被拆分,那麼 JSON 會變得更加棘手。您可能需要特殊的程式碼來彌補差距。

底線

由於您似乎剛剛開始這項工作,我建議您擲硬幣來決定使用哪一個。

但是… 計劃在 6 個月內重新考慮該決定。到那時,您將對程式碼有足夠的經驗,可以對它是否適用於想要的方向有所了解。

當然,6 個月後轉換會很痛苦(*非常痛苦)。*但這將在 12 個月後“不可能”。您可能會決定修補所選模式,而不是切換到其他模式。

或者,您可能會分拆另一家公司以使用其他數據庫模式。一個預測:你會發現“草不綠”,第二家公司會倒閉。

引用自:https://dba.stackexchange.com/questions/122339