MySQL行级别的修订控制

3
我正在为我们的数据库创建数据版本控制。它将具有存储修订版本、回滚和回滚回滚的功能。我使用需要进行版本控制的数据库表如下:
objects object_chunks object_attributes
Objects是主要对象,chunks是对象的分组部分,attributes是块内数据的属性。Attributes存储对象ID以及块ID,这样容易选择一个对象的所有属性,而不必再次加入到chunks表中。
唯一真正会更改的是attributes,但当一个attribute发生变化时,受影响的chunk(s)将被更新,每当chunk更新时,对象也会更新。现在,我已经想到了两种解决这个问题的方法。
1. 创建三个新表,并附加后缀_rev,这些表将简单地存储对象的旧版本。实际对象也将存储rev编号。所以假设我更改了三个不同的属性,这些属性跨越了三个chunks,因此需要在chunks中创建三个新行,在attributes中创建三个新行,在对象中创建一个新行用于版本控制。由于这是第一次更改,所以rev ID将为1,在实际表中,它们的rev将为2。
2. 我只需执行上述操作,但不是使用单独的表格,我只需将其存储在相同的表格中。
需要注意的一件事是,将始终存在修订版本,块的数量可以从1到100+不等。尽管平均值约为1-15,属性可以从0变化到100+。平均值可能约为30。每个属性都将更改。这些对象通过“阶段”进行,所有属性必须由用户填写。填写后,对象被归档并永远不会再次修改。所有对象都有相应的文件。因此,对象还将存储文件的当前哈希(sha256)。此哈希用于去重目的。
2个回答

3
将修订号添加到对象表的主键中绝对是正确的方法。您可以拥有多个活动修订版本,而无需在表之间移动数据。如果选择使用多个表,则会发现编写回滚算法并同时维护完整性约束非常困难,特别是在系统处于活跃开发状态时更为困难。如果修订是在人类时间内创建的,则简单的时间戳可能有效作为修订ID。否则,只需使用整数作为修订号 - 我已经实现了CVS样式的点分修订号,并希望我没有这样做。如果以后有人要求该功能,您可以在单独的表中跟踪导出历史记录。

存储所有数据在一个表中的想法很好,但我不认为我会更改主键,因为它将与系统中的所有内容相关联。我喜欢将修订号保存在单独的字段中,然后每当主要数据更改时只需创建一个新条目。当然,这将需要更新+插入而不是仅插入,但我认为这样做会使工作更容易。虽然我想听听您方法背后的原因。 - William
rev列必须是PK的一部分,因为对象属性与特定的rev相关联。您需要使用显式的rev构建对象,而不是在后台尝试处理修订版本。数据库不是文件系统 - 复杂的模式和完整性约束使得实现外部修订逻辑比仅添加“rev”列到PK要困难得多。例外情况是如果您的PK是合成的,例如自动增量对象ID,则不应将rev添加到PK中,而应该在单独的表中将对象(名称、修订版)映射到对象(ID)。 - Ken Fox
肯·福克斯,是的我正在使用AI列,这让我有点困惑。我有一个新的可能解决方案,很快就会发布,其中包括您的观点和我的观点。想听听您的意见。 - William

0

怎么样?

objects object_chunks revision object_attributes

当版本号是递增的数字时,您可以通过按对象和对象块分组选择具有max(revision)的对象。


基本上我的第二步将涉及为每个修订版本创建一个新条目。虽然与你的不同,我只会插入“新”的数据,并使用当前数据更新主行,因为这比max()更有效。 - William

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接