MySQL行级修订控制

时间:2010-01-10 18:22:01

标签: mysql database row revision

我正在为数据库中的数据创建修订控制。它将能够存储修订,回滚和回滚回滚。我正在使用的数据库表需要修改如下:

对象
object_chunks
OBJECT_ATTRIBUTES

对象是主要对象,块是对象的分组,属性是块内数据的属性。属性存储对象ID以及块ID,方式可以轻松选择对象的所有属性,而无需对块表进行另一次JOIN。

唯一真正改变的是属性,但是当属性发生变化时,受影响的块将被更新,并且每当更新块时,对象也会更新。现在我想到了解决这个问题的两种不同方法。

  1. 创建三个后缀为_rev的新表,这些表只存储旧版本的对象。真实对象也会存储转速。所以假设我改变了三个不同的属性,这些属性跨越三个块,因此三个新的行以块为单位,三个属于属性,一个属于对象以进行修订。由于这是第一次更改,因此rev ID将为1,在实际表格中,其rev将为2。
  2. 我只是简单地执行上述操作,但我只是将其存储在同一个表中,而不是使用单独的表。
  3. 有一点需要注意的是,总会有修改,块的数量可以从1到100+不等。虽然平均值在1-15左右。属性可以在0到100+之间变化。平均值可能在30左右。每个属性都会改变。这些对象进入“阶段”,其中所有属性必须由用户填写。一旦它们被填满,该对象就会被存档,并且永远不会被再次修改。所有对象都有相应的文件。所以对象也会存储文件的当前哈希值(sha256)。此哈希用于重复数据删除。

2 个答案:

答案 0 :(得分:3)

将修订版ID添加到对象表的主键中绝对是可行的方法。您可以拥有多个活动修订版,而不必在表之间移动数据。使用多个表,您会发现很难编写回滚算法来移动数据,同时保持完整性约束 - 如果系统处于活动开发状态,则尤其困难。

如果在人工时创建修订版,则简单时间戳可以用作修订版ID。否则只需使用整数作为修订号 - 我已经实现了CVS样式的点缀修订号,并希望我没有。如果人们稍后要求使用该功能,您可以在单独的表中跟踪派生历史记录。

答案 1 :(得分:0)

怎么样

objects object_chunks revision object_attributes

如果修订版本的数量不断增加,您可以简单地选择具有按对象进行最大(修订)分组的对象,以及将来的object_chunks。