为了账号安全,请及时绑定邮箱和手机立即绑定

用于修订的数据库设计?

用于修订的数据库设计?

慕桂英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。这将减慢该过程的速度,并增加一些限制,例如我们无法在修订数据字段上添加联接。“设计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 


查看完整回答
反对 回复 2019-11-21
  • 3 回答
  • 0 关注
  • 655 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信