我们在Web应用程序中有一个模块,我们在其中输入文档。它是一个普通的文件,你可以一个接一个地输入不同的段落。
e.g。
文件名称
第1段。
第2段。
第3段。
文档可以有多个版本,如版本1.0,1.2,2.0等。
它的工作方式是你获取1.0版的文档,添加/删除或更改一些段落并将其保存为新版本。
为此,我有
1)带有(document_Id(PK),document_name,version)
的Document表2)带有(paragraph_Id(PK),paragraph_data)
的段落表3)文档段落参考表(document_Id(PK)和paragraph_Id(PK))
对于文档的每个版本,新条目将放在文档表中,因此将创建一个新的document_Id(PK)。
因此,表格如下所示
document_Id document_name version
1文件1 1.0
2文件1 1.2
3文件1 1.5
paragraph_Id paragraph_data
10 Para 1
20 Para 2
30 Para 3
40 Para 4
50 Para 5
60 Para 6
文件段落参考表
document_Id paragraph_Id
1 10
1 20
1 30
因此,我们的文档1名称为“文档1”,版本(1.0)有三个段落。
当我们创建此文档的新版本时,请说同名文档1和版本增加到1.2。
在这个新版本中,我们从旧版本文档中删除前两个段落并添加两个新段落。
所以,实际上我们的新文档现在有三个段落(一个来自旧版本,另外两个是新添加的)。
在创建新版本的文档时,请注意旧的段落ID也会更改。即,删除了具有id 10,20的旧文档段落,并且在新版本中具有id 30的段落变为40。
创建新的ID以便仍然可以访问旧文档并且具有id为30的段落的引用,并且可以在创建文档的新版本时更改旧段落的内容。
所以,现在我需要比较文档的两个版本。
我如何比较这两个版本,即如何知道哪些段落在较新版本中被更改或者哪些段落被新添加或哪些段落从旧版本中删除,因为每次都会创建新的ID并且无法将段落ID从版本映射到版本。
另请注意,同一文档可能有多个版本,我需要比较1.0到10.5之类的任何版本吗?
任何帮助将不胜感激。
由于
答案 0 :(得分:1)
如果您保持段落ID不变,您可以轻松地在每个文档的段落级别显示差异。
假设Document1 v1有Parag 10,20,30,v1.2有Parag 30,40,50,那么你可以说“在v1和v1.2之间,Parag 10和20删除了,添加了40,50 ”。这很容易。
现在棘手的部分:如果在文档版本之间更改了段落的内容,那么您必须为新内容创建一个新段落(使用新的ID)并链接它们(即“Parag 60 is a a改变Parag 30“)所以你可以说”for v1.2,parag 30改为parag 60“。要获得两者之间的差异,您需要一个text-diff算法
答案 1 :(得分:0)
这看起来非常像版本控制系统。您的“段落”是“文件”,“文档”是“提交”。
好消息是你不必完全重新发明轮子。坏消息是,这个东西实际上是一棵树,RDBMS在处理树木方面不是很好。
段落的每个初始版本都是版本树的根(对于文档都是相同的)。您需要一种方法来检查该段落是否是该段落的祖先,反之亦然,或者它们是无关的。您可以直接遍历一堆子父链接(Oracle擅长),或使用前缀和like
查询,或使用范围和between
查询,具体取决于您选择表示的方式那个树。假设您没有跟踪数百万次更改,那么这两种技术都应该是有效的。 (参见:the book,a refresher)
我无法理解您如何跟踪文档的版本。如果您需要根据段落版本检测优先级,这在极端情况下有点棘手(例如,新版本的文档将一个段落还原为先前版本并同时更新另一个段落)。
如果您被允许仅标记“此文档基于该文档”这一事实,则更容易;对于文档版本,您只需要一棵树,段落版本只需要很多树。