我需要在应用程序中构建"版本控制",并且想知道如何最好地接近它.
我有这个一般模式:
模型A有很多B
在更新时,A的属性需要进行版本控制,其关联对象(B)也需要进行版本控制.因此,应用程序将显示A的当前版本,但也必须能够查看以前版本的A及其关联对象.
我想使用文档存储,但这只是应用程序的一部分,并且拥有doc存储和关系数据库会带来更多的复杂性.
我考虑过使用星型模式,但在我进步之前,我想知道是否有一个设计模式可以解决这个问题?
这个问题倾向于解决在关系数据库中存储关联对象的版本的问题.哪里有固有的需要能够有效地查询数据(即序列化对象是不够的).
更新:我在想什么/已实施但想看看它是"更好的方式"
,---------. 1 * ,--------. | Model A |----------| Model B| `---------' `--------' |PK | | a_id | |b_version| |version | |version | `--------' `---------'
我将复制模型A和所有相关的B并增加版本属性.然后通过b_version和b.version进行选择以加入B'.只是想知道这是否可以做得更好.
Martin Fowler有一些关于基于时间/版本设计模式的好文章 - 绝对值得一看:
http://martinfowler.com/eaaDev/timeNarrative.html
我不认为版本化本身没有特定的GoF设计模式,因为它存在许多实现.
版本控制的最简单实现是对象的链接列表.其中列表中的每个节点都是可版本化对象的新版本.为了节省空间,您还可以实现某种差异,以显示修订版之间的差异.这样,您可以在数据库中存储差异,但也可以存储可版本化对象的最终版本,因为版本控制系统应该能够在其间导出版本.
数据库模式主要看起来像这样(你可以在大多数wiki系统中看到这种模式):
+--------------------+ 1 * +-----------------------------+ | VersionableObject |---------| Diff | +--------------------+ +-----------------------------+ | lastStateContent | | difference | | originalAuthor | | revision | | #dates and whatnot | | # userId, dates and whatnot | +--------------------+ +-----------------------------+
如果你想用分支和东西去硬核,你可能要考虑看一下现代分布式版本控制系统使用的DAG.
现在,如果我们谈论您的示例,需要在配置中保存一大堆对象.即我们必须挑选出我们想要的模型对象的修订版.这意味着我们有多对多的关系(用中间表解决),有点像这样:
+---+ 1 * +---------------+ 1 * +-----------------+ * 1 +-------+ | B |-------| Diff |-------| ModelSelection |-------| Model | +---+ +---------------+ +-----------------+ +-------+ | revisionNo | | {PK} configId | | {FK} configId | | {FK} modelId | +---------------+ +-----------------+
我希望这有帮助.