SQL

用于修订的数据库设计?

发布于 2021-05-10 21:10:37

我们在项目中要求将实体的所有修订(更改历史记录)存储在数据库中。目前,我们有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个要维护其修订的实体)。

关注者
0
被浏览
37
1 个回答
  • 面试哥
    面试哥 2021-05-10
    为面试而生,有面试问题,就找面试哥。

    千万不能把它们都放在一个表与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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看