Php 使用CodeIgniter在数据库中记录更改的合适方法是什么
我想为我的小型CodeIgniter应用程序创建一个简单的审计系统。这样,它将在编辑表项之前对该表项进行快照。我能想到的一种方法是创建一个Php 使用CodeIgniter在数据库中记录更改的合适方法是什么,php,mysql,codeigniter,Php,Mysql,Codeigniter,我想为我的小型CodeIgniter应用程序创建一个简单的审计系统。这样,它将在编辑表项之前对该表项进行快照。我能想到的一种方法是创建一个news\u audit表,它将复制新闻表中的所有列。它还将为每个更改创建一个新记录,并添加日期列。您对如何将这些功能构建到PHP web应用程序中有什么看法?我们在这里看到的是什么规模?平均而言,条目是经常编辑还是不经常编辑 根据您对平均项的预期编辑次数,存储大数据块的差异可能比存储数据的完整副本更有意义。我喜欢的一种方法是将其放入表本身。您只需添加一个“v
news\u audit
表,它将复制新闻表中的所有列。它还将为每个更改创建一个新记录,并添加日期列。您对如何将这些功能构建到PHP web应用程序中有什么看法?我们在这里看到的是什么规模?平均而言,条目是经常编辑还是不经常编辑
根据您对平均项的预期编辑次数,存储大数据块的差异可能比存储数据的完整副本更有意义。我喜欢的一种方法是将其放入表本身。您只需添加一个“valid_until”列。当您“编辑”一行时,只需复制该行并在旧行上加盖“valid_until”字段。有效行是未设置“valid_until”的行。简言之,你让它在写的时候复制。不要忘记将您的主键设置为原始主键和有效的_until字段的组合。还要设置约束或触发器,以确保每个ID只能有一行在设置之前没有有效的\u 这有好处也有坏处。好处是桌子少。缺点是表中的行要多得多。如果您经常需要访问旧数据,我建议使用这种结构。只需在查询中添加一个简单的WHERE,就可以查询表在以前日期/时间的状态 如果您只需要偶尔访问旧数据,那么我不建议您这样做
在中小型项目中,我使用以下一组规则:
修补程序/
)086\u添加的\u登录\u唯一的\u约束.sql
)这种方法可以很好地扩展。曾为PHP/PostgreSQL项目工作,该项目由1300多个类和200多个表/视图组成。在决定使用哪种解决方案之前,需要考虑以下几点: 如果您的表很大(或可能变得很大),您的审计跟踪需要按照您的描述放在一个单独的表中,否则性能会受到影响 如果您需要一个除了添加新条目之外无法(可能)修改的审核,那么它只需要对应用程序具有插入权限(并且要成为铸铁,需要在专用的日志服务器上…) 我会避免在同一个表中创建审计记录,因为这可能会让另一个开发人员感到困惑(他们可能没有意识到他们需要过滤掉没有日期的旧记录),并且会使表中的审计行杂乱无章,这将迫使db缓存比需要的更多的磁盘块(=性能成本)。如果您的数据库没有索引空值,那么正确地索引可能会有问题。如果选择对最新版本进行时间戳,则查询最新版本将涉及一个子查询 如果数据库支持,最干净的解决方法是在新闻表上创建一个更新触发器,将旧值复制到一个单独的审计表(只需要插入权限)。通过这种方式,逻辑被构建到数据库中,因此您的应用程序不必关心它,它们只需更新数据,而db负责保存更改日志。触发器的主体将只是一个INSERT语句,因此,如果您以前没有编写过INSERT语句,则不会花费很长时间 如果我知道您使用的是哪个数据库,我可能会发布一个示例…我们的做法(您可能希望根据大小和使用情况预先设置存档),但我们创建了一个审计表,其中存储了用户信息、时间,然后以XML形式使用表名存储更改 如果您使用的是SQL2005+,那么您可以在需要时轻松搜索XML以查找更改 然后,我们将触发器添加到表中,以捕获我们想要审核的内容(插入、删除、更新…)
然后,通过简单的序列化,我们就可以恢复和复制更改。我使用过这个,它工作得非常好。您需要在插入、更新和删除时触发,并在每种情况下保存正确的内容,但基本上就是这样。你可以“免费”得到一个很好的审计表,我对使用触发器很陌生,但我听说过它们。感谢您花时间解释这一点。听起来这对我来说是一个合适的选择!我使用的数据库是mySQL 5.1