慕桂英546537
2019-11-21 14:33:18
我們在項目中要求將實體的所有修訂(更改歷史記錄)存儲在數據庫中。目前,我們有2個為此設計的提案:例如,對于“雇員”實體設計1:-- Holds Employee Entity"Employees (EmployeeId, FirstName, LastName, DepartmentId, .., ..)"-- Holds the Employee Revisions in Xml. The RevisionXML will contain-- all data of that particular EmployeeId"EmployeeHistories (EmployeeId, DateModified, RevisionXML)"設計2:-- Holds Employee Entity"Employees (EmployeeId, FirstName, LastName, DepartmentId, .., ..)"-- In this approach we have basically duplicated all the fields on Employees -- in the EmployeeHistories and storing the revision data."EmployeeHistories (EmployeeId, RevisionId, DateModified, FirstName, LastName, DepartmentId, .., ..)"還有其他方法可以做到這一點嗎?“設計1”的問題在于,每次需要訪問數據時,我們都必須解析XML。這將減慢該過程的速度,并增加一些限制,例如我們無法在修訂數據字段上添加聯接?!霸O計2”的問題在于,我們必須在所有實體上重復每個字段(我們要維護其大約70-80個實體的修訂版)。
3 回答

慕田峪4524236
TA貢獻1875條經驗 獲得超5個贊
千萬不能把它們都放在一個表與IsCurrent鑒別屬性。這僅會導致一系列問題,需要代理密鑰和各種其他問題。
設計2確實存在模式更改問題。如果更改了Employees表,則必須更改EmployeeHistories表及其所伴隨的所有相關存儲??赡苁鼓募軜嫺墓ぷ骷颖?。
設計1運作良好,如果做得好,不會對性能造成太大影響。您可以使用xml模式甚至索引來克服可能的性能問題。您對解析xml的評論是有效的,但是您可以使用xquery輕松創建視圖-您可以將其包含在查詢中并加入其中。像這樣
CREATE VIEW EmployeeHistory
AS
, FirstName, , DepartmentId
SELECT EmployeeId, RevisionXML.value('(/employee/FirstName)[1]', 'varchar(50)') AS FirstName,
RevisionXML.value('(/employee/LastName)[1]', 'varchar(100)') AS LastName,
RevisionXML.value('(/employee/DepartmentId)[1]', 'integer') AS DepartmentId,
FROM EmployeeHistories
添加回答
舉報
0/150
提交
取消