如何保存MySQL中的记录更新历史记录?

时间:2010-03-29 09:16:09

标签: php mysql logging frameworks

我必须在PHP中创建一个代码,这样我就可以在MySQL数据库中保存记录更新的历史记录,这样我就可以按日期查找旧版本。

这是我实际想要实现的例子: http://en.wikipedia.org/w/index.php?title=Tunisia&action=history

数据主要是我们记录的关于公司的数字,用于生成报告和提取索引。

我计划使用codeigniter,因为它很简单,我正在寻找一个框架或开源项目的想法,它使用相同的方法来保存数据库中的修改历史。

6 个答案:

答案 0 :(得分:16)

最简单的解决方案(取决于您的特定需求)可能是为您的表添加更新/插入/删除触发器,因此您可以在插入/更新/删除数据时执行额外的日志记录。这样就可以覆盖对数据库的人工干预......

查看http://dev.mysql.com/doc/refman/5.1/en/triggers.html了解详情。

答案 1 :(得分:8)

保持版本历史记录的一种简单方法是创建基本相同的表(例如,使用_version后缀)。这两个表都有一个版本字段,对于主表,您为每次更新都会增加。版本表将在(id, version)上具有复合主键。

每当您对实际表进行更新时,您还会在版本表中插入包含重复数据的新行。每当您想要查找版本历史记录时,您需要做的就是SELECT * FROM content_version WHERE id = CONTENT_ID ORDER BY version

如果您使用Doctrine ORM之类的东西,它会有一种行为,可以通过事件侦听器自动执行此操作。您可以在此处查看:http://www.doctrine-project.org/documentation/manual/1_2/en/behaviors#core-behaviors:versionable

答案 2 :(得分:6)

有一个开源(MIT许可证)框架来构建CRM和ERP类型的数据库驱动的Web应用程序。您也可以从SourceFroge上的http://epe.si/下载 EPESI http://sourceforge.net/projects/epesi/

EPESI的CRUD 引擎 - 记录浏览器 - 具有非常高效的记录历史记录以及其他功能,如高级权限系统(下至现场级别)等等

单个记录集将数据存储在多达10个表中,并且与数据库无关(使用PHPAdoDB)。名为 recordset_data 的表存储“原始”数据和更改历史记录存储在另外两个表中: recordset_edit_history recordset_edit_history_data

Record的edit_history具有以下结构:

  • ID(此表的主键,索引)
  • 编辑(时间戳:2008-05-14 15:18:15)
  • 编辑:(用户名)

记录的edit_history_data具有以下结构:

  • edit_id =编辑记录中的ID
  • field =已更改字段的名称
  • old_value =已更改字段的值。

这是一个非常快速和高效的引擎,它存储的变化不在记录上,而是存储在单个字段级别上。

答案 3 :(得分:2)

您必须在应用程序和数据库之间使用额外的层。你可以自己做一个非常简单的事情(而不是直接调用mysql_query你调用一个包装它并跟踪更新的函数,或者使用一些现有的ORM。在伪代码中

my_mysql_query($query){
    if($query is an update){
        //Log stuff before query
    }
    $r = mysql_query($query);

    if ($r && $query is an update){
        //Log stuff after query
    }
    return $r;
}

然后在您的应用中,您拨打my_mysql_query而不是mysql_query。  您可以检查该表是否是您要跟踪的表,并且可以将该行复制到原始表的副本中。

如果您使用Doctrine ORM,则可以使用其Event Listeners来获得所需内容。

答案 4 :(得分:1)

这不是记录实际的SQL更新。它正在记录数据的更新。实际上它将存储页面的每个版本,并且默认情况下只提供最新版本。未存储用于它的SQL代码。

因此,你必须采取类似的方法。每次数据更改时,您都需要弄清楚数据的更改方式并存储此“补丁”数据。您可能最好存储最新版本,而不是必须通过所有补丁来实现它。这意味着您将能够看到类似

的内容
! created file
* added data to cell D4 'product descript' D5 'set of pens' E5 '£5.99'
* added data to cell D6 'toaster' E5 '£10'
& changed data in cell D4 'Product Description'

这些更改中的每一项都需要与时间戳一起存储或在完成时存储。您还需要制定自己的Scheeme来存储对数据的更改。

另一个更简单的解决方案是使用wiki引擎,如果您愿意在网页中工作,它可以提供您想要的所有功能。您可能需要花一些时间让它更好地满足您的需求,让人们从更完整的视图中编辑它,而不是原始的wiki。

答案 5 :(得分:1)

如果我理解正确,您只是在特定表格中保存“数字”,并且您想要该数字的修订历史记录?

我会说:编写你的数据模型,使其包含该数字的历史记录。因此,您不仅要记录该数字的最新值,还要保留以前的任何值。

这样做的一个简单方法是使用包含以下字段的表:

  • ID
  • companyId
  • 时间戳

如果您想知道当前的号码,请执行

SELECT * FROM table WHERE companyId = X ORDER BY timestamp DESC LIMIT 1

如果您想查看所有修订,请执行以下操作:

SELECT * FROM table WHERE companyId = X