Как отследить добавление / удаление / изменение абзаца в разных версиях документов? - PullRequest
0 голосов
/ 22 марта 2011

В нашем веб-приложении есть модуль, в который мы вводим документ. Это обычный документ, в котором вы можете вводить разные абзацы один за другим.

например.

Название документа

абзац 1.

абзац 2.

пункт 3.

Документ может иметь несколько версий, например версии 1.0, 1.2, 2.0 и т. Д.

Как это работает, вы берете документ версии 1.0, добавляете / удаляете или изменяете некоторые абзацы и сохраняете его как новую версию.

Для этого у меня есть

1) Таблица документов с (идентификатор_документа (PK), имя_документа, версия)

2) таблица абзацев с (para_Id (PK), para_data)

3) справочная таблица абзаца документа с (document_Id (PK) и para_Id (PK))

Для каждой версии документа в таблицу документов добавляется новая запись, поэтому будет создан новый идентификатор_документа (PK).

Итак, таблицы будут выглядеть следующим образом

document_Id версия документа name_

1 Документ 1 1.0

2 Документ 1 1.2

3 Документ 1 1,5

para__d пункт_data

10 Параграф 1

20 Параграф 2

30 Параграф 3

40 Параграф 4

50 Параграф 5

60 Параграф 6

Таблица ссылок на абзацы документов

document_Id абзац_Id

1 10

1 20

1 30

Итак, наш документ 1 с именем «Документ 1» и версией (1.0) состоит из трех параграфов.

Когда мы создаем новую версию этого документа, произносим то же имя Документ 1, и версия увеличивается до 1.2.

В этой новой версии мы удаляем первые два абзаца из документа старой версии и добавляем два новых абзаца.

Итак, теперь наш новый документ состоит из трех параграфов (один из старой версии и два недавно добавленных).

При создании новой версии документа обратите внимание, что старый идентификатор абзаца также изменяется. то есть из старого документа абзацы с идентификатором 10, 20 удаляются, а абзацы с идентификатором 30 становятся 40 в новых версиях.

Новый идентификатор создается таким образом, что к старому документу все еще можно получить доступ, и в нем есть ссылка на абзац с идентификатором 30, и можно изменять содержимое старого абзаца при создании новой версии документа.

Итак, теперь мне нужно сравнить две версии документа.

Как сравнить две версии, т.е. как узнать, какие абзацы были только что изменены в более новой версии или какие были добавлены заново или какие были удалены из более старых версий, поскольку новые идентификаторы создаются каждый раз, и нет способа сопоставить идентификаторы абзаца от версии к версии.

Также обратите внимание, что может быть несколько версий одного и того же документа, и мне нужно будет сравнить любые версии, скажем, от 1.0 до 10.5 и т. Д.

Любая помощь будет оценена.

Спасибо

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Если вы оставите Id абзаца без изменений, вы можете легко показать различия на уровне абзаца в каждом документе.

Скажем, у Document1 v1 есть Parag 10,20,30, а у v1.2 есть Parag 30,40,50, то вы можете сказать «между v1 и v1.2, пункты 10 и 20, где удалено, и 40,50 добавлено».Это простая часть.

Теперь сложная часть: если содержимое абзаца изменяется между версиями документа, то вы должны создать новый абзац для нового содержимого (с новым идентификатором) и ссылкуих (т. е. «Параг. 60 - это изменение по сравнению с Параг. 30»), так что вы можете сказать «для v1.2, пункт 30 изменен на Параг. 60».Чтобы получить различия между ними, вам нужен алгоритм text-diff

0 голосов
/ 22 марта 2011

Это очень похоже на систему контроля версий.Ваши «абзацы» - это «файлы», а «документы» - «коммиты».

Хорошая новость заключается в том, что вам не нужно полностью изобретать велосипед.Плохая новость заключается в том, что в действительности это дерево, а СУБД не очень хороши в обработке деревьев.

Каждая начальная версия абзаца является корнем дерева версий (то же самое для документов).Вам нужен способ проверить, является ли этот абзац предком этого абзаца, или наоборот, или они не связаны.Вы можете либо напрямую пройти через несколько дочерних родительских ссылок (Oracle это хорошо умеет), либо использовать префиксы и like запросы, либо использовать диапазоны и between запросы, в зависимости от того, как вы решите представлять дерево.Предполагая, что вы не отслеживаете миллионы изменений, любая техника должна быть эффективной.(См .: книга , переподготовка )

Мне не удалось понять, как вы отслеживаете версии документов.Если вам нужно определить приоритет на основе версий абзаца, в угловых случаях это немного сложно (например, новая версия документа возвращает один абзац к предыдущей версии и одновременно обновляет другой абзац).

Если вам разрешено просто отметить тот факт, что «этот документ основан на этом документе», это гораздо проще;вам нужно только одно дерево для версий документов, а не несколько деревьев для версий абзацев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...