如何維護數據庫審計?
我正在使用 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 個月後“不可能”。您可能會決定修補所選模式,而不是切換到其他模式。
或者,您可能會分拆另一家公司以使用其他數據庫模式。一個預測:你會發現“草不綠”,第二家公司會倒閉。