具有多级嵌套关系版本控制的对象

Posted

技术标签:

【中文标题】具有多级嵌套关系版本控制的对象【英文标题】:Object wiht multi-level nest relationship versioning 【发布时间】:2014-06-12 02:53:28 【问题描述】:

我有一个复杂的对象结构,它具有描述产品配置的多级嵌套关系。配置会随着时间的推移而改变,我需要能够在将来的任何时候引用不同的配置。在任何时候,整个系统都与产品的特定版本相关联,并以某种方式抽象为产品版本的整个概念。

实现这一点最直接的方法是在每次请求新版本时克隆产品的整个结构并将不同版本链接在一起。然而,就数据库负载而言,这是否有点过头了。有没有更好的办法?

我还考虑过单独跟踪更改并在请求版本时重建产品,但实施起来似乎相当复杂,并且要正确处理多级嵌套关系。

或者

在数据库中保存最少的元数据,以跟踪版本并使用 GIT 等工具序列化整个产品结构。

【问题讨论】:

【参考方案1】:

VCS 工具不是为此目的而设计的。这是一个应用程序功能(版本历史),应该这样对待。实现这一点的正确方法是为每个版本化的项目类型创建一个“存档”表,并通过 ID 将它们与当前的“实际”项目相关联。

然后,每当项目更改时,获取其当前状态并更新存档,然后再将项目的更改提交到主项目表。

重要的区别在于,这不是为您的C# 对象存储版本历史的情况,它是用于存储概念最终用户“项目的版本历史”的应用程序功能“在您的应用程序中。 “产品历史”和“产品对象历史”不是一回事;你想实现前者。您的对象状态和它们实际代表的项目是两个不同的东西。

Git 等版本控制工具用于存储应用程序本身的修订版,而不是为应用程序使用的数据提供归档功能。这属于数据库。

或者,如果问题是能够将您的数据回滚到特定时间点,那么这应该通过为您的数据库拍摄带有日期戳的快照来实现,可以根据需要换出,因为这完全是独立于应用程序本身。

【讨论】:

我同意你的观点,这是一个特性,应该被这样对待。作为单独的表/存储库的存档可以很好地存储不同的版本,但是,整个系统应该能够在任何用户选择的任何时候链接到特定版本,因此不能交换数据库以反映特定的版本版本。将产品克隆并存储在同一个表中,可能在某些时候使用分区,在我看来,这是将整个系统从不同产品版本的存在中抽象出来的唯一方法。 那么您应该在数据库内的单个存档表中存档 - 如果这是用户可以切换的内容,那么您需要开始将其视为应用程序功能,而不是数据库管理/版本控制任务。使用链接到主要产品的 ProductID 跟踪 ProductArchive 表中的每个版本。然后编写代码以按日期/版本号/您需要的任何内容获取特定版本。 如果我采用 ProductArchive 方式,我需要为每个依赖表(ProductItems、ProductXXX ....)创建一个存档表,或者每个表都需要一个 ProductID 和 ProductArchiveID,这完全是低效的: ( 为需要归档的每种类型的项目创建一个归档/历史表执行此操作的正确方法。或者,您可以为每个现有表添加一个修订号,并将历史记录和当前产品存储在同一个位置,但是您需要为每个产品使用单独的唯一标识符来标识其修订,这可能会增加检索当前版本。这些方法中的任何一种都行得通,但是,是的,这需要时间和精力——实现所有应用程序数据的用户可读版本历史记录并非易事。

以上是关于具有多级嵌套关系版本控制的对象的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb - 多级菜单分组嵌套“递归”写法

SQL Server 2016 无法将系统版本控制添加到关系表

使用嵌套的对象数组创建多级下拉列表

腌制对象版本控制

使用 RestKit 处理多级动态嵌套属性

实现数据库对象的版本控制