相关疑难解决方法(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万
查看次数

在可见之前,需要批准的数据库记录存储更改的最佳方法是什么?

我需要将用户输入的更改存储到特定表中,但在管理用户查看和批准之前不会显示这些更改.虽然这些更改仍处于暂挂状态,但我仍会显示旧版本的数据.存储这些变更等待批准的最佳方法是什么?

我想过几种方法,但无法弄清楚什么是最好的方法.这是一个非常小的网络应用程序.一种方法是使PendingChanges表模仿其他表的模式,然后一旦批准更改,我就可以用信息更新真实表.另一种方法是进行某种记录版本控制,其中我在表中存储多个版本的数据,然后始终使用已标记为已批准的最高版本号来提取记录.这将限制额外表的数量(我需要为多个表执行此操作),但每次我提取一组记录以确保获得正确的记录时,我需要进行额外的处理.

这些方法或其他可能有用的个人经历?

更新:只是为了澄清,在这种特殊情况下,我对历史数据不感兴趣.我只需要某种方式来批准用户在网站上发布之前所做的任何更改.因此,用户将编辑他们的"配置文件",然后管理员将查看该修改并批准它.一旦获得批准,这将成为显示的值,并且不需要保留旧版本.

是否有人尝试过以下解决方案,您可以在任何需要在特殊PendingChanges表中将其作为XML跟踪的表中存储挂起的更改?每个记录都有一个列,表示更改所针对的表,可能存储将要更改的记录的id的列(如果是新记录则为null),更改时存储的日期时间列,以及用于存储已更改记录的xml的列(可以序列化我的数据对象).由于我不需要历史记录,因此在批准更改后,将更新真实表并删除PendingChange记录.

有关该方法的任何想法?

database-design

40
推荐指数
3
解决办法
1万
查看次数

如何跟踪数据库表中的数据更改

跟踪数据库表中更改的最佳方法是什么?

想象一下,您有一个应用程序,其中用户(在应用程序的上下文中而不是数据库用户)能够更改存储在某个数据库表中的数据.跟踪所有更改历史记录的最佳方法是什么,以便您可以显示哪个用户在何时更改哪些数据如何?

database

33
推荐指数
3
解决办法
5万
查看次数

审计表:表或一个表的每个字段

除了审计字段之外,我的项目中的一切都很好.只是插入和更新正在我们想象的宇宙中进行审核.

我提出了一个类似于下一个例子的表:

但是我的团队没有想到同样的方式,他们在每个表上放置一列来跟踪更新或插入时间.当我问为什么?他们告诉我,这就是他们在工作中保持轨道的方式.

最后我放弃了,我把每个字段放在每张桌子上.由于除了我以外的所有团队,都告诉我把那些领域.

例:

他们的方法

Table Customer
+-------------+-------------+-----+--------------------------------+-------------+
| Name        | LastName    | ... | LastModification (Audit Field) | User        |
+-------------+-------------+-----+--------------------------------+-------------+
| varchar(30) | varchar(50) | ... | datetime                       | varchar(30) |
+-------------+-------------+-----+--------------------------------+-------------+
Run Code Online (Sandbox Code Playgroud)

我的方法

Table Customer
+-------------+-------------+-----+
| Name        | LastName    | ... |
+-------------+-------------+-----+
| varchar(30) | varchar(50) | ... |
+-------------+-------------+-----+

Table Audit
+-----------+------------+--------+------+-------------+
| TableName | TableField | Action | User | DateAndTime |
+-----------+------------+--------+------+-------------+
Run Code Online (Sandbox Code Playgroud)

所以问题是:

哪个是更好的设计,一个表保存事务的历史记录或每个表的一个字段?(正确和缺点)

database audit

18
推荐指数
1
解决办法
7800
查看次数

如何跟踪数据库表中多列的更改以进行审计?

这个问题已经多次得到解答了:这里,这里和外部链接在这里这里.

我理解上面线程中描述的方法,我打算使用这种方法.

但我在实施这一点时几乎没有什么基本疑虑.

在我的情况下,一行中的多个列可以同时更新,因此遵循正确的实现方式:

  1. 找出操作类型(INSERT/UPDATE/DELETE)
  2. 找出正在更新的列
  3. 在更新之前阅读完整行
  4. 在Audit表中为每个要更改的列插入一行,包含旧值和新值(以及其他详细信息)
  5. 更新表格

mysql database database-design

6
推荐指数
1
解决办法
1933
查看次数

在MySQL中插入,删除表(魔术表)

我是MS-SQL的常规用户,但现在正在开发一个以mysql作为后端的项目.

请告诉我在mysql中是否存在这样的插入/删除表(魔术表),我可以在触发器内或普通查询中使用.

mysql database-trigger

5
推荐指数
1
解决办法
8646
查看次数