多个相关数据的修订控制

时间:2010-12-30 19:00:33

标签: php mysql database version-control

我正在尝试弄清楚如何最好地保留有关多行数据修订的修订/历史信息,以防由于某种原因我们需要恢复到该数据。

这是一般的布局:

item
---------------
id
title
etc...

region
---------------
id
title
etc...

release_type
-----------------
id
title
etc...

items_released_dates_data
---------------------
item_id
region_id
release_type_id (these three form the primary key)
date

因此,每个项目可以有一个发布日期+ region_id + release_type,我们基本上只跟踪日期(出于这个问题的目的,'日期'可以是数字,字符串或其他。我肯定再次遇到这个问题)

批量提交更改,当在items_released_dates_data中添加新数据时,首先删除item_id = your_id,然后插入语句添加新值(可能这不是最好的方法吗?)

我的想法是创建一个像:

的表
items_release_dates_data_history
-------------------------------------
item_id
timestamp
description
raw_data

使描述简要概述已更新的内容,并包括某些格式的数据,如json或xml,或者可以在客户端快速解码的内容,以便用户查看更改并选择修改为给定的版本。那么items_released_dates_data的每一个条目都需要一个条目到items_released_dates_data_history(听起来不像是一个问题吗?:|)

我已经阅读了一些关于mysql触发器的内容,这些内容在这里很有帮助,但坦率地说,我对它们一无所知,所以我正在使用我理解的内容。

我的问题是,我是否按照正确的方式对这些内容进行了修改,是否有任何建议/最佳做法可以让我知道如何改进此方法?

2 个答案:

答案 0 :(得分:2)

我是Alex Miller的评论。到目前为止,你写的所有内容都是有意义的。

尽管你有所保留,我强烈建议你研究一下触发器。它们相当容易掌握,并在这种情况下成为一个非常强大的工具。使用触发器,您可以在每次更新(或删除)记录时将行的副本存储到单独的表中。如果你想全神贯注,你可以在触发器中将输入数据与现有数据进行比较,并只写下已经改变的数据。

对于这些类型的表,还要考虑存档存储引擎而不是MyISAM或InnoDB - 它们是为这种工作而制作的。

此外,您可能正在寻找的搜索短语是“审计跟踪”。

答案 1 :(得分:1)

我会说你肯定是在正确的轨道上。虽然,您可能希望将区域ID存储在历史记录中,以便您可以根据区域而不是整个项目来检查发布历史记录。

至于delete + insert,只要你没有得到太多的流量就没关系,因为那些都是锁定动作。插入或删除行以更新索引时会花费大量时间。如果您正在使用MyISAM表,它也将暂停表中的所有读取,直到这些操作完成。更新也会,但时间要短得多。 InnoDB只会锁定行,所以这并不是真正的问题。