mysql - 数据库 - 记录实体的变化

标签 mysql database logging storing-data

问题是如何正确地做到这一点。

情况: 我有一个包含产品的表,我需要记录对其的更改,以便可以轻松查看某些属性的更改者和时间。

每个产品实体都包含(仅列出一些属性):

  • expire_date - DATETIME 格式
  • 系列 - VARCHAR(255)
  • 包裹 - INT(32 )(包裹中有多少件元素)

将来我将记录更多属性。 (约10-15)

这是表的基本结构,它将存储有关更改的信息。

          [
       'id' => 'pk',
       'type' => 'INT(32)',
       'product_id' => 'INT(32)',
       'user_id' => 'INT(32)',
       'data_old' => 'VARCHAR(255)',
       'data_new' => 'VARCHAR(255)',
       'created' => 'DATETIME'
          ], 'ENGINE=InnoDB CHARSET=utf8');

这对于系列属性来说效果很好。

但是expire_date 和package 又如何呢? 我想将它们存储到 VARCHAR 中是愚蠢的。

我面临以下解决方案:

  • 将所有属性存储在 VARCHAR 中
  • 为每种类型的属性创建字段,因此我最终会得到以下字段:data_old_varchar、data_new_varchar、data_old_int、data_new_int、data_new_datetime、data_old_datetime
  • 为每种类型的属性创建一个单独的表,例如我将拥有表product_logging_varchar、product_logging_int、product_logging_datetime
  • 创建一个单独的表来记录每种类型的属性,例如Product_logging_series、product_logging_expire_date、product_logging_....(还有大约 15 个表,民意调查)

我不喜欢上面的任何选项。

有没有更好的解决办法?

最佳答案

根据我的经验,我总是通过创建带有前缀 (audit_TableName) 和另外 3 列的每个表的副本来实现表审计(日志记录):

  1. 用户名//谁执行操作
  2. 何时//行动日期
  3. 内容//插入、更新或删除

通常(Oracle、MySql)触发器已用于填充此表。 因此,对于每个表,还有 1 个表和 3 个触发器(插入、更新、删除)。

如果数据库结构经常改变,这有点沉重和痛苦,但这个解决方案总是适用于获取任何数据历史/记录/审计,如下:

  • 获取特定数据的所有历史记录
  • 获取更新时间表/用户事件
  • 重新加载之前的数据状态
  • 事件在时间/日期间隔内发生
  • ...

我听说有一个工具可以很好地完成这项工作:https://flywaydb.org/ ,但还没用过。

关于mysql - 数据库 - 记录实体的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42904617/

相关文章:

MySql 删除 - 与选择(加入)相同

mysql - Spring DAO rewritebatchedstatements 不适用于具有嵌入 ID 的实体上的 SaveAll()

java - 后台 Chrome 浏览 session 问题

java - 无法检索 blob 数据并在 JLabel-mySql 中显示

database - GoLang Multi-Tenancy 应用程序数据库连接

java - 寻找 Java 在线异常跟踪器

testing - 如何向日志监听器添加一些额外的列?

mysql - CONCAT 和 LIMIT 的 SQL 版本

android - 从数据库中获取数据并将其设置在 edittext 上

javascript - 如何将不同类型的 webview javascript 消息记录到 java ide 控制台