Php 使用CodeIgniter在数据库中记录更改的合适方法是什么

Php 使用CodeIgniter在数据库中记录更改的合适方法是什么,php,mysql,codeigniter,Php,Mysql,Codeigniter,我想为我的小型CodeIgniter应用程序创建一个简单的审计系统。这样,它将在编辑表项之前对该表项进行快照。我能想到的一种方法是创建一个news\u audit表,它将复制新闻表中的所有列。它还将为每个更改创建一个新记录,并添加日期列。您对如何将这些功能构建到PHP web应用程序中有什么看法?我们在这里看到的是什么规模?平均而言,条目是经常编辑还是不经常编辑 根据您对平均项的预期编辑次数,存储大数据块的差异可能比存储数据的完整副本更有意义。我喜欢的一种方法是将其放入表本身。您只需添加一个“v

我想为我的小型CodeIgniter应用程序创建一个简单的审计系统。这样,它将在编辑表项之前对该表项进行快照。我能想到的一种方法是创建一个
news\u audit
表,它将复制新闻表中的所有列。它还将为每个更改创建一个新记录,并添加日期列。您对如何将这些功能构建到PHP web应用程序中有什么看法?

我们在这里看到的是什么规模?平均而言,条目是经常编辑还是不经常编辑


根据您对平均项的预期编辑次数,存储大数据块的差异可能比存储数据的完整副本更有意义。

我喜欢的一种方法是将其放入表本身。您只需添加一个“valid_until”列。当您“编辑”一行时,只需复制该行并在旧行上加盖“valid_until”字段。有效行是未设置“valid_until”的行。简言之,你让它在写的时候复制。不要忘记将您的主键设置为原始主键和有效的_until字段的组合。还要设置约束或触发器,以确保每个ID只能有一行在设置之前没有有效的\u

这有好处也有坏处。好处是桌子少。缺点是表中的行要多得多。如果您经常需要访问旧数据,我建议使用这种结构。只需在查询中添加一个简单的WHERE,就可以查询表在以前日期/时间的状态

如果您只需要偶尔访问旧数据,那么我不建议您这样做


在中小型项目中,我使用以下一组规则:

  • 所有代码都存储在版本控制系统(即Subversion)下
  • 源代码中有SQL修补程序的目录(即
    修补程序/
  • 此目录中的所有文件都以序列号开头,后跟简短说明(即
    086\u添加的\u登录\u唯一的\u约束.sql
  • 对DB架构的所有更改必须记录为单独的文件。签入版本控制系统后,无法更改任何文件。必须通过发布另一个补丁来修复所有bug。严格遵守这条规则很重要
  • 小脚本会记住本地环境中最后执行的修补程序的序列号,并在需要时运行后续修补程序
  • 通过这种方式,您可以保证可以轻松地重新创建DB模式,而无需导入整个数据转储。创建这样的补丁是不需要动脑筋的。只需在console/UI/web前端运行命令,并在成功的情况下将其复制粘贴到修补程序中。然后将其添加到repo并提交更改


    这种方法可以很好地扩展。曾为PHP/PostgreSQL项目工作,该项目由1300多个类和200多个表/视图组成。

    在决定使用哪种解决方案之前,需要考虑以下几点:

    如果您的表很大(或可能变得很大),您的审计跟踪需要按照您的描述放在一个单独的表中,否则性能会受到影响

    如果您需要一个除了添加新条目之外无法(可能)修改的审核,那么它只需要对应用程序具有插入权限(并且要成为铸铁,需要在专用的日志服务器上…)

    我会避免在同一个表中创建审计记录,因为这可能会让另一个开发人员感到困惑(他们可能没有意识到他们需要过滤掉没有日期的旧记录),并且会使表中的审计行杂乱无章,这将迫使db缓存比需要的更多的磁盘块(=性能成本)。如果您的数据库没有索引空值,那么正确地索引可能会有问题。如果选择对最新版本进行时间戳,则查询最新版本将涉及一个子查询

    如果数据库支持,最干净的解决方法是在新闻表上创建一个更新触发器,将旧值复制到一个单独的审计表(只需要插入权限)。通过这种方式,逻辑被构建到数据库中,因此您的应用程序不必关心它,它们只需更新数据,而db负责保存更改日志。触发器的主体将只是一个INSERT语句,因此,如果您以前没有编写过INSERT语句,则不会花费很长时间

    如果我知道您使用的是哪个数据库,我可能会发布一个示例…

    我们的做法(您可能希望根据大小和使用情况预先设置存档),但我们创建了一个审计表,其中存储了用户信息、时间,然后以XML形式使用表名存储更改

    如果您使用的是SQL2005+,那么您可以在需要时轻松搜索XML以查找更改

    然后,我们将触发器添加到表中,以捕获我们想要审核的内容(插入、删除、更新…)


    然后,通过简单的序列化,我们就可以恢复和复制更改。

    我使用过这个,它工作得非常好。您需要在插入、更新和删除时触发,并在每种情况下保存正确的内容,但基本上就是这样。你可以“免费”得到一个很好的审计表,我对使用触发器很陌生,但我听说过它们。感谢您花时间解释这一点。听起来这对我来说是一个合适的选择!我使用的数据库是mySQL 5.1