Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
 версионность документов  [new]
AndrewVL
Member

Откуда:
Сообщений: 738
Здравствуйте.


озадачился собственно сабжем. Именно версионность. а не логирование изменений.

вроде все на первый взгляд просто. для однотабличного документа.
делаем таблицу ревизий.
в другую таблицу выносим неверсионируемые данные (nonversioned) , во вторую версионируемые (versions).

ну и собственно в nonversioned указывает ИД текущей версии. а в versions сами данные версии и ссылку на версию, к которой они относятся.

А вот если двухтабличный документа. где есть шапка и тело.
для шапки так же делаем версионность по вышеописанной схеме. ну и вроде как так же для тела. те будет 4 таблицы. две для шапки и две для тела.

Но возникает такой вопрос. есть документ. у него тело содержит допустим 1000 позиций.
Создаем ему версию. меняется что то в шапке. да хотя бы банальное примечание.
В таблицах шапки создаем версию. а как быть с телом? теоретически если поменялось примечание в шапке, то в позициях ничего не менялось.
Я правильно понимаю, что все же придется скопировать в таблицах тела все 1000 записей и сопоставить их с новой версией шапки?

И далее делаем изменение данных двух записей тела. как быть с неизменившимися записями тела документа?
5 окт 17, 23:46    [20846873]     Ответить | Цитировать Сообщить модератору
 Re: версионность документов  [new]
AndrewVL
Member

Откуда:
Сообщений: 738
И далее.

у этого версионированного документа есть дочерние.
допустим спецификация - договор.
5 окт 17, 23:51    [20846877]     Ответить | Цитировать Сообщить модератору
 Re: версионность документов  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1468
AndrewVL,

Если отвлечься от заголовков и шапок, вопрос сводится к такому.

Вот у тебя, скажем, огромный текстовый файл, и ты хочешь вести его версии.

Первый вариант - копировать весь файл целиком для каждой версии: file_001.txt, file_002.txt и т.д. Преимущества - просто и надежно. Недостатки - пропадает место. Если версий от силы десяток, как это бывает с бумажными документами, вполне применимо.

Второй вариант - писать диффы. То ли от первоначальной версии вести, и суммированием диффов собирать текущее состояние, то ли, наоборот, вести текущую версию файла, а историю изменений помнить диффами, и при необходимости собирать через них любую промежуточную версию вплоть до превоначальной. Преимущества и недостатки обратные - сложно, зато экономично. Если это исходники линукса, которые правит весь мир - другого выхода нет.

Собственно, и в базе данных надо выбрать один из этих подходов. А затем уже думать над реализацией в БД.
6 окт 17, 09:20    [20847135]     Ответить | Цитировать Сообщить модератору
 Re: версионность документов  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1468
AndrewVL
Я правильно понимаю, что все же придется скопировать в таблицах тела все 1000 записей и сопоставить их с новой версией шапки?

И далее делаем изменение данных двух записей тела. как быть с неизменившимися записями тела документа?


Здесь может помочь идея, что "версия документа" - это отдельная сущность (не шапка документа, а вообще отдельная таблица).

А всякие записи документов (шапка, детали, детали деталей) могут относиться не к одной, а ко многим версиям, если они в ходе этих версий не менялись. То есть "детали-версии" должна быть N-N таблица.
6 окт 17, 09:51    [20847196]     Ответить | Цитировать Сообщить модератору
 Re: версионность документов  [new]
Alibek B.
Member

Откуда:
Сообщений: 2499
Альтернатива — версии задавать не номером ревизии, а интервалом дат, в котором действуют определенные данные.
Правда это не версионность, а историчность, и у нее свои особенности.
6 окт 17, 10:18    [20847283]     Ответить | Цитировать Сообщить модератору
 Re: версионность документов  [new]
Злой Бобр
Member

Откуда: Украина, Кривой Рог
Сообщений: 3240
AndrewVL,

Cane Cat Fisher описал оба варианта правильно. Большинство выбирает 2 вариант. Ну а реализация уже зависит от СУБД и кривизны рук разработчика.
6 окт 17, 11:07    [20847444]     Ответить | Цитировать Сообщить модератору
 Re: версионность документов  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 7684
Alibek B.
Альтернатива — версии задавать не номером ревизии, а интервалом дат, в котором действуют определенные данные.
Правда это не версионность, а историчность

... и именно поэтому она не покрывает всех кейсов версионности.
6 окт 17, 11:32    [20847527]     Ответить | Цитировать Сообщить модератору
 Re: версионность документов  [new]
AndrewVL
Member

Откуда:
Сообщений: 738
собственно такую схему нарисовал


-- хранятся версии документов по типам. непосредственно номера
CREATE TABLE DOCS_VER (
    C          INTEGER NOT NULL, --ПК
    VER          INTEGER NOT NULL, --ИД версии
    PARENT_ID  INTEGER, -- родительская версия
    DOCTYPE    SMALLINT NOT NULL  -- тип документа (может быть много документов)
);

-- общие шапки ВСЕХ документов
CREATE TABLE DOCS (
    C            INTEGER NOT NULL, --ПК
    FLAG1   INTEGER NOT NULL, --общий для всех документов атрибут
    FLAG2   INTEGER NOT NULL, --общий для всех документов атрибут
    FLAG3   INTEGER NOT NULL, --общий для всех документов атрибут
    DOCS_VER_ID  INTEGER NOT NULL, -- ссылка на ТЕКУЩУЮ версию
    DOCTYPE      SMALLINT NOT NULL -- тип документа (избыточно)
);



Собственно в DOCS хранятся все заголовки всех типов документов. на каждый документ вне зависимости от количества версий одна запись

CREATE TABLE DOCS1 (
    C            INTEGER NOT NULL, --ПК
    DOCS_ID   INTEGER NOT NULL, --ссылка на общую таблицу заголовков
    data1   INTEGER NOT NULL, 
    data2   INTEGER NOT NULL, 
    data3   INTEGER NOT NULL, 
    ........
    DOCS_VER_ID  INTEGER NOT NULL -- ссылка на таблицу версий. к какой версии документа принадлежит строка.
);


Этих таблиц много по количеству типов документов. на один документ в DOCS может быть несколько записей в DOCS1. по количеству версий. текущая версия в этой таблице - docs1.docs_id = docs.C and docs1.docs_ver_id = docs.docs_ver_id

собственно вроде и все.


а дочерние документы линкуются к docs. а текущая версия подгребается по docs1.docs_id = docs.C and docs1.docs_ver_id = docs.docs_ver_id. проблем с изменением родительского документа при наличии дочернего нет. ну только предупредить пользователя чтоб обратил внимание.

Может что то и избыточно.

например если без версий получал все документы одного типа так

select * from docs1


теперь так

select * from docs
left join docs1 on docs1.docs_id = docs.C and docs1.docs_ver_id = docs.docs_ver_id
where docs.DOCTYPE = 1


слегка непривычно и можно временами путаться )))

ну и надо наверно в триггерах на DOCS1 сделать проверки чтоб не торнули запись из DOCS не того типа
7 окт 17, 21:17    [20851358]     Ответить | Цитировать Сообщить модератору
 Re: версионность документов  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1468
AndrewVL,

Честно говоря, как-то мудрено вышло.
7 окт 17, 22:41    [20851465]     Ответить | Цитировать Сообщить модератору
 Re: версионность документов  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 7684
У Вас как-то странно сделано, Версии - родительская таблица к Документам, хотя должно быть наоборот.
7 окт 17, 23:39    [20851532]     Ответить | Цитировать Сообщить модератору
 Re: версионность документов  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1468
AndrewVL,

Мне на скорую руку что-то такое представилось. Поможет?

К сообщению приложен файл. Размер - 91Kb
9 окт 17, 12:14    [20854061]     Ответить | Цитировать Сообщить модератору
Все форумы / Проектирование БД Ответить