Php 多条相关数据的修订控制

Php 多条相关数据的修订控制,php,mysql,database,version-control,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 re

我正试图找出如何最好地保存多行数据修订的修订/历史信息,以防出于某种原因需要恢复到该数据

这是布局的一般类型:

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
因此,每个项目+区域id+发布类型可以有一个发布日期,我们基本上只跟踪日期(在这个问题中,“日期”可以是数字、字符串或其他任何形式。我肯定会再次遇到这个问题)

批量提交更改,当添加新数据时,items\u released\u dates\u data中的所有内容,其中item\u id=您的\u id首先被删除,然后一条insert语句添加新值(也许这不是最好的方法?)

我的想法是创建一个如下表:

items_release_dates_data_history
-------------------------------------
item_id
timestamp
description
raw_data
将description作为更新内容的简短摘要,并以某种格式(如json或xml)包含数据,或者可以在客户端快速解码的数据,以便用户查看更改并选择修改为给定版本。然后,条目_发布_日期_数据的每个条目也需要条目_发布_日期_数据_历史(听起来不是问题,是吗?:|)

我读过一些关于mysql触发器的文章,这些文章在这里会很有帮助,但坦率地说,我对它们一无所知,所以我正在研究我所了解的东西


我的问题是,我是否遵循了正确的方法来版本这些东西,是否有任何人可以给我任何关于如何改进这种方法的建议/最佳实践?

我想说,你肯定走在了正确的道路上。尽管如此,您可能希望在历史记录中存储区域ID,以便可以基于区域而不仅仅是整个项目检查发布历史记录


至于delete+insert,只要不产生太多的流量就可以了,因为这两种操作都是锁定操作。插入或删除行以更新索引时需要花费大量时间。如果您使用的是MyISAM表,它还将停止表上的所有读取,直到这些操作完成。更新也会,但时间要短得多。InnoDB只会锁定行,所以这不是真正的问题。

我支持Alex Miller的评论。到目前为止,你所写的一切都有意义

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

还考虑存档存储引擎,而不是MyISAM或NoYDB,用于这些类型的表——它们是为这种类型的工作而制作的。< /P>


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

它们是InnNodeB,所以这很酷,而且是关于历史区域的一个好观点