问题是如何正确地做到这一点。
情况: 我有一个包含产品的表,我需要记录对其的更改,以便可以轻松查看某些属性的更改者和时间。
每个产品实体都包含(仅列出一些属性):
- 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 列的每个表的副本来实现表审计(日志记录):
- 用户名//谁执行操作
- 何时//行动日期
- 内容//插入、更新或删除
通常(Oracle、MySql)触发器已用于填充此表。 因此,对于每个表,还有 1 个表和 3 个触发器(插入、更新、删除)。
如果数据库结构经常改变,这有点沉重和痛苦,但这个解决方案总是适用于获取任何数据历史/记录/审计,如下:
- 获取特定数据的所有历史记录
- 获取更新时间表/用户事件
- 重新加载之前的数据状态
- 事件在时间/日期间隔内发生
- ...
我听说有一个工具可以很好地完成这项工作:https://flywaydb.org/ ,但还没用过。
关于mysql - 数据库 - 记录实体的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42904617/