数据库 - 数据版本控制

Jea*_*ach 52 database versioning database-design

关于在数据库中对数据进行版本控制,我已经阅读了关于SO的一些问题(比如这一个).

我喜欢上面提到的一些建议.我有最长的时间想要(需要)修改我的许多桌子,但从来没有绕过它.作为一个只有简单的数据库工作的程序员,我想知道如何才能真正做到这一点.

我不是要求SQL语法中的实际解决方案.我最终可以为自己解决这个问题(或者在时机成熟时发布).我只是要求人们评论他们将如何进行评论以及如果我要"修改"数亿条记录,可能会出现任何潜在的性能问题.或者任何其他建议,只要它基于以下示例.

举个简单的例子:

Person
------------------------------------------------
ID                UINT NOT NULL,
PersonID          UINT NOT NULL,
Name              VARCHAR(200) NOT NULL,
DOB               DATE NOT NULL,
Email             VARCHAR(100) NOT NULL

Audit
------------------------------------------------
ID                UINT NOT NULL,
UserID            UINT NOT NULL,               -- Who
TableName         VARCHAR(50) NOT NULL,        -- What
OldRecID          UINT NOT NULL,               -- Where
NewRecID          UINT NOT NULL,
AffectedOn        DATE NOT NULL,               -- When
Comment           VARCHAR(500) NOT NULL        -- Why
Run Code Online (Sandbox Code Playgroud)

如果TableName是一个字符串,我不确定如何将Audit表链接到任何其他表(例如Person)?

另外,假设我有三个GUI来填充:

  1. 特定人员ID的完整记录
  2. 列出所有人的表格视图(按ID)
  3. 一个视图,显示每个人在每个条目下面的修订信息(每人的修订数量,修订日期,修订注释等),按最新修订排序.

要完成1和2,查询Person表或Audit表会更好吗?

要完成3,所谓的数据库专家是否只需获取所有记录并将其传递给软件进行处理,或按PersonID和受影响日期分组?这通常是在一个查询中处理还是多个?

DJ.*_*DJ. 46

多年来我已经完成了各种审计方案,我现在要实现这样的事情:

Person
------------------------------------------------
ID                UINT NOT NULL,
PersonID          UINT NOT NULL,
Name              VARCHAR(200) NOT NULL,
DOB               DATE NOT NULL,
Email             VARCHAR(100) NOT NULL


Person_History
------------------------------------------------
ID                UINT NOT NULL,
PersonID          UINT NOT NULL,
Name              VARCHAR(200) NOT NULL,
DOB               DATE NOT NULL,
Email             VARCHAR(100) NOT NULL
AuditID           UINT NOT NULL


Audit
------------------------------------------------
ID                UINT NOT NULL,
UserID            UINT NOT NULL,               -- Who
AffectedOn        DATE NOT NULL,               -- When
Comment           VARCHAR(500) NOT NULL        -- Why
Run Code Online (Sandbox Code Playgroud)

当前记录始终位于Person表中.如果有更改,则会创建审计记录并将旧记录复制到Person_History表中(请注意,ID不会更改,并且可能有多个版本)

审核ID位于*_History表中,因此您可以根据需要将多个记录更改链接到一个审核记录.

编辑:
如果您没有每个基表的单独历史表,并希望使用相同的表来保存旧的和"已删除"的记录,那么您必须使用状态标志标记记录.在查询当前记录时,这是一个真正的痛苦的问题 - 相信我,我已经做到了.

  • 每个基表的历史表+1.通常需要一个Audit表.如果系统相当繁忙,这可能会导致严重的性能问题.审计表成为每个事务的瓶颈.很简单,如果交易#2等待转#1完成,您的用户将会遇到减速 (10认同)
  • 是的,该记录已从人员表中删除,但移至历史表中。我想历史表上可能有一个指示器来指示它是已删除的记录。 (2认同)

mci*_*321 6

如何正常创建表,在每条记录上都有一个ModifiedDate Colm(如果你愿意,还有ModifiedBy),并通过物化视图进行所有数据访问,该视图按Id对数据进行分组,然后执行HAVING ModifiedDate = MAX(ModifiedDate) )?

这样,添加具有相同Id的新记录将从视图中删除旧记录.如果要查询历史记录,请不要浏览该视图

我总是发现使用相同的Colm维护不同的表是复杂且容易出错的.