有幾個解決方案。
傳統數據庫設計最自然的就是引入每個記錄「有效/從」的概念。對於您的用戶示例表,它將如下所示:
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 sourcing和CQRS是很好的起點。但是,這將需要遠遠超過數據庫模式。
我可以看到這個解決方案工作,如果我只有一個表,但如果我有像UserRole這樣的依賴關係,那麼這種方法將如何適用於鏈中的所有依賴關係? – user1474992
@ user1474992 - 我已經更新了這個問題來演示。 –