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

时间:2009-08-13 21:59:36

标签: php mysql codeigniter

我想为我的小型CodeIgniter应用程序创建一个简单的审计系统。这样在编辑条目之前它将拍摄表条目的快照。我能想到的一种方法是创建一个news_audit表,它将复制新闻表中的所有列。它还会为每个更改创建一个新记录,并添加添加的日期列。您对PHP Web应用程序中构建此类功能的看法和意见是什么?

5 个答案:

答案 0 :(得分:2)

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

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

如果您需要进行无法(可能)修改的审核,除了添加新条目之外,它只需要对应用程序具有INSERT权限(并且铸铁需要位于专用的日志记录服务器上......)

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

如果您的数据库支持,解决此问题的最简单方法是在新闻表上创建一个UPDATE TRIGGER,将旧值复制到只需要INSERT权限的单独审计表中。这种方式逻辑内置于数据库中,因此您的应用程序无需关注它,它们只是更新数据,db负责保留更改日志。触发器的主体只是一个INSERT语句,所以如果你没有写一个,那么它不应该花费很长时间。

如果我知道您正在使用哪个数据库,我可能会发布一个示例...

答案 1 :(得分:1)

我们做了什么(并且您希望根据大小和使用事先设置存档),但我们创建了一个审计表,用于存储用户信息,时间,然后使用表名存储XML中的更改。

如果您使用的是SQL2005 +,则可以根据需要轻松搜索XML以进行更改。

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

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

答案 2 :(得分:0)

我们在这里看多大的规模?平均而言,条目是经常编辑还是偶尔编辑?

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

答案 3 :(得分:0)

我喜欢的一种方法是将它放入表中。您只需添加'valid_until'列即可。当您“编辑”一行时,只需复制一行并在旧行上标记“valid_until”字段即可。有效行是没有设置'valid_until'的行。简而言之,您可以将其复制写入。不要忘记将主键与原始主键和valid_until字段组合使用。还要设置约束或触发器,以确保每个ID只能有一行没有设置valid_until。

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

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

您可以通过构建Temportal database

将这一切发挥到极致

答案 4 :(得分:0)

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

  1. 所有代码都存储在修订控制系统(即Subversion)
  2. 源代码中有一个SQL补丁目录(即patches/
  3. 此目录中的所有文件都以序列号开头,后跟简短说明(即086_added_login_unique_constraint.sql
  4. 必须将对数据库架构的所有更改记录为单独的文件。签入版本控制系统后,无法更改文件。必须通过发布另一个补丁来修复所有错误。坚持这条规则非常重要。
  5. 小脚本会记住本地环境中上次执行的修补程序的序列号,并在需要时运行后续修补程序。
  6. 这样您就可以保证,您可以轻松地重新创建数据库模式,而无需导入整个数据转储。创建这样的补丁是没有道理的。只需在控制台/ UI / web前端运行命令,如果成功,则将其复制粘贴到补丁中。然后将其添加到repo并提交更改。

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