MySQL触发器还是PHP用于数据审计?
我希望在我的应用程序中保留表的每次更新的历史记录。我使用的是Laravel,我知道有一些软件包可以帮助我,但我正在寻找干净快速的东西 我有两个选择:MySQL触发器还是PHP用于数据审计?,php,mysql,laravel,version-control,revision,Php,Mysql,Laravel,Version Control,Revision,我希望在我的应用程序中保留表的每次更新的历史记录。我使用的是Laravel,我知道有一些软件包可以帮助我,但我正在寻找干净快速的东西 我有两个选择: MySQL触发器 通过PHP代码 我的第一个问题是,哪一个更快? 我的第二个问题是: 我应该使用这样的模式并将所有表存储到其中: CREATE TABLE revisions ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `revisionable_type` VARCHAR(
- MySQL触发器
- 通过PHP代码
CREATE TABLE revisions (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`revisionable_type` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`revisionable_id` INT(11) NOT NULL,
`user_id` INT(11) NULL DEFAULT NULL,
`key` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`old_value` TEXT NULL COLLATE 'utf8_unicode_ci',
`new_value` TEXT NULL COLLATE 'utf8_unicode_ci',
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL
)
或者我应该像user_history那样重新创建每个表的“副本”,并在respectives列上添加历史记录
Users: id, name, surname ...
Users_history: id, user_id, name, surname ...
- 如果用户更改事务中的记录,则同一用户将同时更改所有受影响的字段。根据您建议的结构,所有这些更改都需要单独的条目
- 使用建议的结构确定某个记录在给定时间点的外观更为困难,因为您基本上必须重播从插入到该记录的所有更改
- 在pro端,所有更改都存储在一个表中,即使您更改了数据库模式,也不必更改日志记录的结构
- 如果用户更改事务中的记录,则同一用户将同时更改所有受影响的字段。根据您建议的结构,所有这些更改都需要单独的条目
- 使用建议的结构确定某个记录在给定时间点的外观更为困难,因为您基本上必须重播从插入到该记录的所有更改
- 在pro端,所有更改都存储在一个表中,即使您更改了数据库模式,也不必更改日志记录的结构
CREATE TABLE contacts (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`last_name` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`updated_by` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`updated_at` TIMESTAMP NULL DEFAULT NULL
)
我还将创建此模式:
CREATE TABLE contacts_audit (
`id` INT(10) UNSIGNED NOT NULL,
`first_name` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`last_name` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`updated_by` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`updated_at` TIMESTAMP NULL DEFAULT NULL,
`action` varchar(255) NOT NULL COLLATE 'utf8_unicode_ci'
)
然后使用这些触发器(希望我的触发器语法不会太生疏):
潜在缺陷
如果您使用一个MySQL用户名/密码访问数据库,并根据MySQL中的users
表对用户进行身份验证,那么在执行任何删除之前,您需要在PHP中执行更新,然后执行删除操作,以便捕获删除记录的用户
但是,如果您使用MySQL对所有用户进行身份验证,那么您可以在触发器中使用它:注意使用USER()
鉴于此模式:
CREATE TABLE contacts (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`last_name` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`updated_by` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`updated_at` TIMESTAMP NULL DEFAULT NULL
)
我还将创建此模式:
CREATE TABLE contacts_audit (
`id` INT(10) UNSIGNED NOT NULL,
`first_name` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`last_name` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`updated_by` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci',
`updated_at` TIMESTAMP NULL DEFAULT NULL,
`action` varchar(255) NOT NULL COLLATE 'utf8_unicode_ci'
)
然后使用这些触发器(希望我的触发器语法不会太生疏):
潜在缺陷
如果您使用一个MySQL用户名/密码访问数据库,并根据MySQL中的users
表对用户进行身份验证,那么在执行任何删除之前,您需要在PHP中执行更新,然后执行删除操作,以便捕获删除记录的用户
但是,如果您使用MySQL对所有用户进行身份验证,那么您可以在触发器中使用它:注意使用USER()
这个问题是非常离题的,因为它是非常广泛的,并且可能是基于观点的,但触发器是一条路要走。速度更快,可靠性更高,因为它处于DB级别。我可能会提供一个答案,因为这可能很难正确实现。这个问题怎么会偏离他自己的主题呢?也许这是一个DB级别,但这并不意味着MySQL会做得更快:/你没有读我的第二个问题。这个问题非常离题,因为它非常广泛,并且可能基于opinon,但触发器是一个不错的选择。速度更快,可靠性更高,因为它处于DB级别。我可能会提供一个答案,因为这可能很难正确实现。这个问题怎么会偏离他自己的主题呢?也许这是一个DB级别,但这并不意味着MySQL会做得更快:/你没有读我的第二个问题,嗯,这就是我想要的。所以你认为这个解决方案比我上面发布的通用表“更好”吗?嗯,这就是我想要的。所以你认为这个解决方案比我上面发布的通用表“更好”吗?