2017-07-13 106 views
0

我有要求在數據庫中實施更改管理。 通過變更管理我不是指數據庫模式或代碼。我的意思是數據。 例如,如果SQL數據庫包含具有2個用戶的用戶表。 更改用戶1的用戶名是「更改」。設置用戶2的狀態是一個「改變」。 執行這些操作會導致對用戶表中的數據進行兩處更改。我需要能夠記錄這些更改(簡單),但能夠回滾到之前的時間點,以便測試以前的配置或回滾一個錯誤的配置。 對於數據庫設計和如何支持 - 我特別是在引入諸如Role和UserRole之類的鏈接表的時候,我正在抨擊我的頭。應用程序更改管理

任何幫助或想法將不勝感激。

謝謝

回答

1

有幾個解決方案。

傳統數據庫設計最自然的就是引入每個記錄「有效/從」的概念。對於您的用戶示例表,它將如下所示:

UserID UserName Status ValidFrom ValidUntil ... 
============================ 
1  Bob   1 1/1/2017 2/4/2017 
1  Simon  1 2/4/2017 null 
2  Mary   1 6/7/2016 7/7/2017 
2  Mary   2 7/7/2017 null 

您的主鍵將是composite - UserID,ValidFrom。這意味着你所有的外鍵都需要這個組合鏈接。

通過對所有表應用「valid_from/valid_until」,您可以在任何時間點查看數據狀態。

舉例來說,如果你有一個「角色」表:

RoleID RoleName Active ValidFrom ValidUntil ... 
============================ 
1  Admin   1 1/1/2017 2/4/2017 
1  Administrator 1 2/4/2017 null 

和表格來用戶映射到角色......

UserID RoleID . Status ValidFrom ValidUntil ... 
============================ 
1  1   1 1/1/2017 2/4/2017 
1  1   0 2/4/2017 null 

通過尋找用戶數據和角色您感興趣的日期的數據,您可以在該時間點收集應用程序狀態。您確實需要擁有「狀態」標誌,而不是刪除記錄(例如,在我的示例中,用戶1的角色1的成員輪船在2/4時暫停)。

這不是特別簡單;在實踐中,當我使用這個時,我只在時間很重要的表上使用「valid_from/until」。

另一種方法是在應用程序級別解決這個問題 - 在微服務中越來越常見,並且最終保持一致性。 Event sourcingCQRS是很好的起點。但是,這將需要遠遠超過數據庫模式。

+0

我可以看到這個解決方案工作,如果我只有一個表,但如果我有像UserRole這樣的依賴關係,那麼這種方法將如何適用於鏈中的所有依賴關係? – user1474992

+0

@ user1474992 - 我已經更新了這個問題來演示。 –

相關問題