相关疑难解决方法(0)

审计日志的数据库设计

每次我需要设计一个新的数据库时,我都会花一些时间考虑如何设置数据库模式来保存更改的审核日志.

这里已经提出了一些问题,但我不同意所有场景都有一个最好的方法:

我还偶然发现了这篇关于维护数据库更改日志的有趣文章,该文章试图列出每种方法的优缺点.它写得很好并且有很多有趣的信息,但它使我的决定更加困难.

我的问题是:是否有一个我可以使用的参考,可能是一本书或类似决策树的东西,我可以参考决定我应该根据一些输入变量去哪种方式,例如:

  • 数据库模式的成熟度
  • 如何查询日志
  • 需要重新创建记录的概率
  • 更重要的是:写或读性能
  • 正在记录的值的性质(字符串,数字,blob)
  • 存储空间可用

我知道的方法是:

1.为创建和修改的日期和用户添加列

表格示例:

  • ID
  • _1
  • _2
  • VALUE_3
  • 创建日期
  • 修改日期
  • 由...制作
  • modified_by

主要缺点:我们失去了修改的历史.提交后无法回滚.

2.仅插入表格

表格示例:

  • ID
  • _1
  • _2
  • VALUE_3
  • 删除(布尔值)
  • 用户

主要缺点:如何保持外键最新?需要巨大的空间

3.为每个表创建单独的历史记录表

历史表示例:

  • ID
  • _1
  • _2
  • VALUE_3
  • VALUE_4
  • 用户
  • 删除(布尔值)
  • 时间戳

主要缺点:需要复制所有审计表.如果架构发生更改,则还需要迁移所有日志.

4.为所有表创建合并历史记录表

历史表示例:

  • TABLE_NAME
  • 领域
  • 用户
  • NEW_VALUE
  • 删除(布尔值)
  • 时间戳

主要缺点:如果需要,我能否轻松重建记录(回滚)?new_value列需要是一个巨大的字符串,因此它可以支持所有不同的列类型.

audit logging database-design

143
推荐指数
4
解决办法
8万
查看次数

数据库设计修订?

我们在项目中要求存储数据库中实体的所有修订(更改历史记录).目前我们有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)"
Run Code Online (Sandbox Code Playgroud)

设计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, .., ..)"
Run Code Online (Sandbox Code Playgroud)

有没有其他办法做这件事? …

sql database versioning database-design

123
推荐指数
8
解决办法
3万
查看次数

数据库 - 数据版本控制

关于在数据库中对数据进行版本控制,我已经阅读了关于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和受影响日期分组?这通常是在一个查询中处理还是多个?

database versioning database-design

52
推荐指数
2
解决办法
2万
查看次数

mysql数据版本控制系统的最佳实践

我必须将文章等数据存储到mysql数据库中,如果文章被修改,我还必须保存旧版本,以便恢复它.我在这个主题上发现了一些类似的问题和帖子,但我不确定,哪种解决方案最能解决问题.

以下是更好理解的基本表格"文章":

文章(身份证,姓名,文字)

对我来说,有两种不同的方法:

方法1

将数据和文章的每个版本存储在表"articles"中,并添加"version"和"status"列.在版本i中存储文章的递增版本号.活动文章获得"状态"1,其他文章获得"状态"2.

Pro的:

  • 只需要一张桌子

  • 新版本是新数据的插入,只是旧状态的"状态"列的更新

反对的

  • 非常大的表(可能是较慢的查询???)

方法2

将字段"version"添加到"articles"并仅将活动数据存储到表"articles"中.旧版本的数据被存储/移动到新表"articles_versioned".

Pro的:

  • 只有实际有效数据在表"文章"中

反对的

  • 出版表格

所以.我忘记了一个好的方法吗?如何处理其他表格中的相关数据(如图像等)?

mysql database versioning

10
推荐指数
1
解决办法
7548
查看次数

标签 统计

database ×3

database-design ×3

versioning ×3

audit ×1

logging ×1

mysql ×1

sql ×1