powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Версионный контроль для EAV базы данных
18 сообщений из 18, страница 1 из 1
Версионный контроль для EAV базы данных
    #35124377
karantir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.

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

Для наглядности прикладываю схематичную картинку.

P.S. И еще один вопрос. Если допустить, что такая модель имеет право на существование, как надо построить SQL запрос, чтобы выбрать последнюю ревизию документа? Сложность в том, что в последней ревизии могло быть изменено значение только одного атрибута, значения остальных надо как-то подтянуть из предыдущих ревизий (причем, желательно, не выбирая вообще все значения для документа с определенным id_doc).

Всем заранее спасибо за участие
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35124690
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karantirкак надо построить SQL запрос, чтобы выбрать последнюю ревизию документа? Сложность в том, что в последней ревизии могло быть изменено значение только одного атрибута, значения остальных надо как-то подтянуть из предыдущих ревизий (причем, желательно, не выбирая вообще все значения для документа с определенным id_doc).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select d.*, s.*
from (
	select s.id_doc, MAX(s.id_docrev) as id_docrev
	from Documents d
		join Documents_Properties_Strings s on
					s.id_doc = d.id_doc
	where <фильтр для документов>
	group by d.id_doc, s.id_docprop
) as t
	join Documents d on
				d.id_doc = t.id_doc
	join Documents_Properties_Strings s on
					s.id_docrev = t.id_docrev
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35125061
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karantirЕсть несколько таблиц, хранящих данные о документах согласно модели EAV. Хочется иметь для этих документов возможность контроля версий.
Для EAV естественный путь внедрения версионности - дополнить таблицу "значений" полями "версия, с которой действует" и "версия, с которой не действует".

karantirP.S. И еще один вопрос. Если допустить, что такая модель имеет право на существование, как надо построить SQL запрос, чтобы выбрать последнюю ревизию документа?
Код: plaintext
select * from values where ... and version_id_cancel is null
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35125211
karantir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
Запрос действительно попроще получается. Немного переделал.

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

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

Необходима полная история изменений.

Необходим контроль доступа (два человека не должны иметь возможность одновременного редактирования)

...и работать все должно на Postgres
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35126215
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понимаю, существуют
FK Documents_Properties_XXX -> Documents_Revisions -- начало периода валидности значения свойства документа есть дата версии документа,
и
FK Documents_Revosions-> Documents -- само собой.
Тогда
1) FK Documents_Properties_XXX -> Documents не добавляет ничего нового.

2)Неясно, почему окончание периода валидности не подчиняется аналогичному правилу.

Еще.
Существует ограничитель сочетаний типов документов и свойств Documents_Properties, и он использован в Documents_Properties_XXX.
3)Однако нет ограничения, гарантирующего, что в Documents_Properties_XXX.Id_doc документ будет иметь тот же тип что и Documents_Properties_XXX.id_docprop.
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35127100
karantir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ModelR,

Я исходил из следующих соображений: изначально хотел не разделять Documents и Documents_Revisions , вести все записи в одной таблице Documents . Но потом посчитал что во-первых, ревизии документов никогда не будут иметь таких свойств как blocked, blocked_by и blocked_from и соответственно для большей части таблицы эти свойства окажуться просто пустыми. Во-вторых, в 99% случаев работа идет с актуальной версией документа и наличие в таблице Documents мертвого груза при больших размерах может привести к замедлению работы. В общем я их разделил. И прямой связи между ними сейчас нет. В принципе ваши замечания 1 и 2 вытекают из этого решения. Скажите, насколько вообще целесообразны мои опасения, может сделать и историю и актуальные версии водной таблице?

Т.е. сейчас при модификации одного из свойств документа, должно происходить следующее
- строка, соответствующая старой ревизии документа, переносится из Documents в Documents_Revisions .
- в Documents записывается новая строка с новыми данными о версии документа (кто-когда-откуда изменил) и тем же id_doc.
- в Documents_Properties_XXX обновляется строка со старым значением свойства (active_to = <время новой ревизии> (наверно, действительно логичнее сделать FK)).
- в Documents_Properties_XXX записывается новая строка c новым значением свойства и ссылкой на новую ревизию документа.

Если слить Documents и Documents_Revisions процесс обновления получится гораздо проще конечно, но не станут ли в последствии тормозить выборки?

По третьему пункту. Да вы правы. Такого ограничения сейчас нет. Я правильно понимаю, что запрет на смену id_doctype для созданного документа должен решить проблему? Как это сделать пока не еще не разобрался. Вроде бы надо копать в сторону constraints, так?

Спасибо за советы )))
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35128339
SNiL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В целях повышения образованности, подскажите пожалуйста что такое "модель EAV" или ссылку на подробное описание. Спасибо.
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35128391
karantir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В этой теме в конце есть три ссылки. Должно помочь.
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35128503
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karantirЕсли можно, покритикуйте пожалуйста готовый дизайн
Не думаю, что стоило разносить значения по такой куче таблиц. В результате даже простейшая операция "покажи мне документ целиком" превращается в сложный запрос, либо - что еще намного хуже - в запрос документа "по очереди по одному полю", операции поиска и прочее тоже усемеряются. Конечно, можно сделать view, но это в лучшем случае приблизит ситуацию к нормальной - если оптимизатор хорошо справится с работой.


Разнобой в типах первичных ключей - очень напрягающая штука. В результате можно быть уверенным, что где-нибудь, где нужен int8, разработчик по рассеяности употребит int4, в результате чего через год-два-три система вдруг рухнет. Лично мой подход: есть тип данных TOraID, есть свойства Field.AsID, Param.AsID, и разработчик клиента сам не знает, какова физическая реализация этого ID.

Эта проблема, кстати, хорошо видна на Вашей схеме: в таблице документов id_doc типа int8, а в таблице версий id_doc типа int4


Ссылки на составные ключи - то еще удовольствие, не думаю, что есть смысл их особо лелеять.


У меня есть ощущение, что у Вас здорово напутано со связями, но детально разбираться в том виде, в котором приведена диаграмма, нет никакого желания.
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35128520
karantir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer ,
Спасибо за критику )
Можно еще несколько вопросов?
softwarerНе думаю, что стоило разносить значения по такой куче таблиц. В результате даже простейшая операция "покажи мне документ целиком" превращается в сложный запрос, либо - что еще намного хуже - в запрос документа "по очереди по одному полю", операции поиска и прочее тоже усемеряются. Конечно, можно сделать view, но это в лучшем случае приблизит ситуацию к нормальной - если оптимизатор хорошо справится с работой.
Как по вашему, сколько типов достаточно? Если учесть что мы говорим не об абстрактных сущностях, а все таки о вполне конкретных -- документах? В принципе можно слить все числовые типы в один и выбросить логический тип... Или вы предлагаете более кардинальные меры?
softwarerСсылки на составные ключи - то еще удовольствие, не думаю, что есть смысл их особо лелеять.
Поясните пожалуйста в чем здесь проблема? Какая разница два поля в ключе или одно? Или это как то влияет на целостность данных?
softwarerУ меня есть ощущение, что у Вас здорово напутано со связями, но детально разбираться в том виде, в котором приведена диаграмма, нет никакого желания.
Они автоматов делались. Главное, что FK правильно стоит, значит и связи наверно в порядке.
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35128556
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karantirКак по вашему, сколько типов достаточно?
Типы и таблицы - разные вещи.

karantirПоясните пожалуйста в чем здесь проблема? Какая разница два поля в ключе или одно? Или это как то влияет на целостность данных?
Как Вам сказать.... представьте себе, что у автомобиля было бы два руля - отдельно на левое и на правое колесо. Для такой конструкции можно придумать применение, но в большинстве случаев это будет неоправданный геморрой.

На целостность это может повлиять по-разному. В принципе, это один из путей дополнительного контроля целостности, но из-за усложнения реализации повышается и риск внести ошибку.
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35128977
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karantirсейчас при модификации одного из свойств документа, должно происходить следующее
- строка, соответствующая старой ревизии документа, переносится из Documents в Documents_Revisions .
- в Documents записывается новая строка с новыми данными о версии документа (кто-когда-откуда изменил) и тем же id_doc.
- в Documents_Properties_XXX обновляется строка со старым значением свойства (active_to = <время новой ревизии> (наверно, действительно логичнее сделать FK)).
- в Documents_Properties_XXX записывается новая строка c новым значением свойства и ссылкой на новую ревизию документа.
Такое поведение характерно скорее для журналирования: пользователь не контролирует значения временнЫх отметок, они создаются автоматически. Версионностью обычно называют контролируемый процесс: пользователь явно указывает временнЫе границы версии и явно выбирает, с какой версией работает. Он также имеет право (в силу смысла приложения ) менять значения свойства для данной версии, каковые изменения в свою очередь могут журналироваться уже на полном автомате.

Уточните, что же в данной задачке?
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35129070
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karantirПо третьему пункту. Да вы правы. Такого ограничения сейчас нет. Я правильно понимаю, что запрет на смену id_doctype для созданного документа должен решить проблему? Как это сделать пока не еще не разобрался. Вроде бы надо копать в сторону constraints, так?

Спасибо за советы )))karantir, сначала общее соображение. Декларативные ограничения базы данных - суть реализация бизнес-правил прикладной области. Понятно, что сколько бы мы не изощрялись, декларативными средствами postrges или любой другой СУБД мы сможем реализовать лишь часть, причем чем сложнее область тем меньшую часть, этих правил.
Конкретно данное ограничение в данной задаче. Нет, запрет изменения одной из таблиц, участвующих в оганичении, суть которого - согласованность значений двух или более таблиц, конечно не поможет.
Пример реализации ограничения "тот же самый". Однако из общих соображений, это можно оставить и для приложения.
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35130308
karantir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ModelRУточните, что же в данной задачке?
Версии создаются автоматически каждый раз при внесении правок. Пользователь может изменять только актуальную версию документа.
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35131071
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда ИМХО разделение оправдано, ибо логика транзакций у них другая, особенно если "только" а не "99%".
По критерию скорости - postgres кажется умеет сжимать пустые поля, т.е. здесь выигрыша не будет.
По логике все же не совсем понятно а для чего вообще versions? В частности, если все на автомате, то как определяется id_docstate?
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35131075
karantir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще один вопрос.
Как сделать так, чтобы при выборке свойств документа запрос затрагивал только те таблицы в которых эти свойства реально присутствуют. Т.е. допустим, если документ имеет только три строковых свойства и одно текстовое, не делать join по таблицам для всех типов.
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35131083
karantir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ModelRВ частности, если все на автомате, то как определяется id_docstate?
id_docstate определяет состояние документа, имеющее опосредованное отношение к версионности. Служит для организации базового документооборота. Если, допустим, есть документ, который должен пройти несколько инстанций перед окончательным утверждением. Определеяется пользователем. Это если кратко.
...
Рейтинг: 0 / 0
Версионный контроль для EAV базы данных
    #35133813
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karantirИ еще один вопрос.
Как сделать так, чтобы при выборке свойств документа запрос затрагивал только те таблицы в которых эти свойства реально присутствуют. Т.е. допустим, если документ имеет только три строковых свойства и одно текстовое, не делать join по таблицам для всех типов.Ну во-первых join не обязательно . Кроме того запросы могут генерироваться динамически. Наконец, возможно есть какие-то фичи СУБД, но это конечно лучше выяснить на профильном форуме.

З.Ы. А softwarer предупреждал...
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Версионный контроль для EAV базы данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]