2010-03-29 247 views
19

我必须在PHP中创建一个代码,使我可以在MySQL数据库中保留记录更新的历史记录,以便我可以按日期查找旧版本。如何在MySQL中保留记录更新的历史记录?

这里是什么,我想actualy才达到的例子: http://en.wikipedia.org/w/index.php?title=Tunisia&action=history

的数据大多是我们记录有关该公司生成报表并提取索引号。

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

回答

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' 

所有这些变化将需要存储与时间戳或当他们在那里完成。您还需要制定自己的方案来存储数据的更改。

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

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来获取所需内容。

7

保持版本历史记录的一个简单方法是创建一个基本相同的表(例如_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

+5

为什么不这样做:'main table'只包含'id'而'version_id''version'表包含所有的数据? – Shaheer 2013-11-03 06:05:12

+0

谢谢@莎黑尔我会试试这个。 – Eric 2015-12-30 15:52:32

+0

@Shaheer因为大多数查询都是针对当前数据的,所以将历史记录拆分为单独的表格可以确保这些查询不会让表格变为* n *倍的性能损失。 * n *的大小取决于记录更新的频率。 – 2017-02-02 11:42:05

1

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

我会说:写你的datamodel,以便它包含该号码的历史。因此,您不仅可以记录该号码的最新值,还可以保留以前的任何值。

这样做的一个简单的方法是通过具有以下字段的表:

  • ID
  • companyId
  • 时间戳

如果你想知道目前的号码,只是做

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

如果你想看到所有的修订只是做:

SELECT * FROM table WHERE companyId = X 
+0

这是我试图从一个简单的Excel文件迁移的仪表板。由于我不熟悉ORM方式,我更愿意编写自己的代码。 – Proxium 2010-03-29 10:19:10

+0

哪个可以是好东西:) – 2010-03-30 11:12:53

+1

SELECT * FROM表where WHERE companyId = X ORDER BY timestamp DESC LIMIT 1 – DarkSide 2013-10-03 22:42:14

15

最简单的解决方案(根据您的具体需求)很可能是在更新/插入添加/删除触发你的表,所以你可以在插入/更新/删除数据时执行额外的日志记录。这种方式,即使人工干预数据库将涵盖...

检查http://dev.mysql.com/doc/refman/5.1/en/triggers.html欲了解更多信息。

6

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

EPESI的CRUD引擎 - 记录浏览器 - 有一个非常有效的记录历史,以及其他功能,如高级权限系统(降低到现场水平)等等。

单个记录集在多达10个表中存储数据,它与数据库无关(使用PHPAdoDB)。名为的表recordset_data存储“原始”数据和更改历史记录存储在2个附加表中:recordset_edit_historyrecordset_edit_history_data

记录的edit_history具有以下结构:

  • ID(此表的主键,索引)
  • 编辑上(时间戳:2008-05-14 15点18分十五秒)
  • 被修改由:(用户ID)

记录的edit_history_data具有以下结构:

  • edit_id = ID从编辑历史
  • 字段=被更改
  • OLD_VALUE =已更改的字段的值的字段的名称。

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