Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL触发器还是PHP用于数据审计?_Php_Mysql_Laravel_Version Control_Revision - Fatal编程技术网

MySQL触发器还是PHP用于数据审计?

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(

我希望在我的应用程序中保留表的每次更新的历史记录。我使用的是Laravel,我知道有一些软件包可以帮助我,但我正在寻找干净快速的东西

我有两个选择:

  • 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端,所有更改都存储在一个表中,即使您更改了数据库模式,也不必更改日志记录的结构

    • >P>如果您想记录所有表的更改或只选择一些表,则还必须考虑。

      >P>如果记录的表引用其他表,还需要考虑如何记录。例如,如果您想要记录事务,那么您可能有一个事务类型字段和一个单独的事务类型表,其中列出了关于每个事务类型的详细描述和其他信息。如果不再使用某个事务类型,则可以将其从事务类型表中删除,或更改其参数

  • 对这两种解决方案都计时,您将看到哪一种更适合您。在您的应用程序和环境中,很难说哪一个会更快
  • 这是一个设计决策,因此它实际上取决于您和您的需求。您需要考虑以下事项:

    • 如果用户更改事务中的记录,则同一用户将同时更改所有受影响的字段。根据您建议的结构,所有这些更改都需要单独的条目

    • 使用建议的结构确定某个记录在给定时间点的外观更为困难,因为您基本上必须重播从插入到该记录的所有更改

    • 在pro端,所有更改都存储在一个表中,即使您更改了数据库模式,也不必更改日志记录的结构

    • >P>如果您想记录所有表的更改或只选择一些表,则还必须考虑。

      >P>如果记录的表引用其他表,还需要考虑如何记录。例如,如果您想要记录事务,那么您可能有一个事务类型字段和一个单独的事务类型表,其中列出了关于每个事务类型的详细描述和其他信息。如果不再使用某个事务类型,则可以将其从事务类型表中删除,或更改其参数

  • 鉴于此模式:

    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会做得更快:/你没有读我的第二个问题,嗯,这就是我想要的。所以你认为这个解决方案比我上面发布的通用表“更好”吗?嗯,这就是我想要的。所以你认为这个解决方案比我上面发布的通用表“更好”吗?