3

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

对象
object_chunks
object_attributes

对象是主要对象,块是对象的一部分,属性是块内数据的属性。属性以这种方式将对象 ID 与块 ID 一起存储 选择对象的所有属性很容易,而无需对块表进行另一次 JOIN。

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

  1. 创建三个后缀为 _rev 的新表,这些表将仅存储旧版本的对象。真实的对象也会存储一个转速。因此,假设我更改了三个不同的属性,这些属性跨越三个块,因此块中的三个新行,属性中的三个,以及对象中的一个用于修订。由于这是第一次更改,rev ID 将为 1,在实际表中,它们的 rev 将为 2。
  2. 我只是简单地做上面的事情,但不是有一个单独的表,我只是将它存储在同一个表中。

需要注意的一件事是,总会有修订,块的数量可以从 1 到 100+ 不等。虽然平均值在1-15左右。属性可以从 0 到 100+ 不等。平均值可能在 30 左右。每个属性都会改变。这些对象经过一个“阶段”,所有属性都必须由用户填写。一旦它们被填满,对象就会被归档并且不再被修改。所有对象都有一个对应的文件。所以对象也将存储文件的当前哈希(sha256)。此哈希用于重复数据删除目的。

4

2 回答 2

3

向对象表的主键添加修订 ID 绝对是要走的路。您可以有多个活动修订,而不必在表之间移动数据。使用多个表时,您会发现很难编写回滚算法来移动数据同时保持完整性约束——如果系统正在积极开发中,则尤其困难。

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

于 2010-01-10T20:08:11.417 回答
0

怎么样

objects object_chunks revision object_attributes

如果修订的数量越来越多,您可以简单地选择未来按对象、object_chunks 分组的 max(revision) 的对象。

于 2010-01-10T19:33:26.170 回答