|
|
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
Всем привет. Есть несколько таблиц, хранящих данные о документах согласно модели EAV. Хочется иметь для этих документов возможность контроля версий. Есть несколько идей (собственно все они всего лишь абберации одного подхода), но все они не кажутся мне оптимальными. Может кто нибудь поделиться опытом или своими догадками? Для наглядности прикладываю схематичную картинку. P.S. И еще один вопрос. Если допустить, что такая модель имеет право на существование, как надо построить SQL запрос, чтобы выбрать последнюю ревизию документа? Сложность в том, что в последней ревизии могло быть изменено значение только одного атрибута, значения остальных надо как-то подтянуть из предыдущих ревизий (причем, желательно, не выбирая вообще все значения для документа с определенным id_doc). Всем заранее спасибо за участие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 14:55 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
karantirкак надо построить SQL запрос, чтобы выбрать последнюю ревизию документа? Сложность в том, что в последней ревизии могло быть изменено значение только одного атрибута, значения остальных надо как-то подтянуть из предыдущих ревизий (причем, желательно, не выбирая вообще все значения для документа с определенным id_doc). Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 16:24 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
karantirЕсть несколько таблиц, хранящих данные о документах согласно модели EAV. Хочется иметь для этих документов возможность контроля версий. Для EAV естественный путь внедрения версионности - дополнить таблицу "значений" полями "версия, с которой действует" и "версия, с которой не действует". karantirP.S. И еще один вопрос. Если допустить, что такая модель имеет право на существование, как надо построить SQL запрос, чтобы выбрать последнюю ревизию документа? Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 18:04 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
softwarer Запрос действительно попроще получается. Немного переделал. Если можно, покритикуйте пожалуйста готовый дизайн. Какие есть недочеты в структуре, в выборе типов полей, возможные неэффективности, неоптимальности и т.д. Система должна по идее выполнять несколько основных требований. Каждый документ может иметь любое количество свойств заранее неизвестных типов. Необходима полная история изменений. Необходим контроль доступа (два человека не должны иметь возможность одновременного редактирования) ...и работать все должно на Postgres ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2008, 18:55 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
Если я правильно понимаю, существуют 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2008, 11:23 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
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, так? Спасибо за советы ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2008, 14:36 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
В целях повышения образованности, подскажите пожалуйста что такое "модель EAV" или ссылку на подробное описание. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2008, 21:30 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
В этой теме в конце есть три ссылки. Должно помочь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2008, 22:18 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
karantirЕсли можно, покритикуйте пожалуйста готовый дизайн Не думаю, что стоило разносить значения по такой куче таблиц. В результате даже простейшая операция "покажи мне документ целиком" превращается в сложный запрос, либо - что еще намного хуже - в запрос документа "по очереди по одному полю", операции поиска и прочее тоже усемеряются. Конечно, можно сделать view, но это в лучшем случае приблизит ситуацию к нормальной - если оптимизатор хорошо справится с работой. Разнобой в типах первичных ключей - очень напрягающая штука. В результате можно быть уверенным, что где-нибудь, где нужен int8, разработчик по рассеяности употребит int4, в результате чего через год-два-три система вдруг рухнет. Лично мой подход: есть тип данных TOraID, есть свойства Field.AsID, Param.AsID, и разработчик клиента сам не знает, какова физическая реализация этого ID. Эта проблема, кстати, хорошо видна на Вашей схеме: в таблице документов id_doc типа int8, а в таблице версий id_doc типа int4 Ссылки на составные ключи - то еще удовольствие, не думаю, что есть смысл их особо лелеять. У меня есть ощущение, что у Вас здорово напутано со связями, но детально разбираться в том виде, в котором приведена диаграмма, нет никакого желания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2008, 00:00 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
softwarer , Спасибо за критику ) Можно еще несколько вопросов? softwarerНе думаю, что стоило разносить значения по такой куче таблиц. В результате даже простейшая операция "покажи мне документ целиком" превращается в сложный запрос, либо - что еще намного хуже - в запрос документа "по очереди по одному полю", операции поиска и прочее тоже усемеряются. Конечно, можно сделать view, но это в лучшем случае приблизит ситуацию к нормальной - если оптимизатор хорошо справится с работой. Как по вашему, сколько типов достаточно? Если учесть что мы говорим не об абстрактных сущностях, а все таки о вполне конкретных -- документах? В принципе можно слить все числовые типы в один и выбросить логический тип... Или вы предлагаете более кардинальные меры? softwarerСсылки на составные ключи - то еще удовольствие, не думаю, что есть смысл их особо лелеять. Поясните пожалуйста в чем здесь проблема? Какая разница два поля в ключе или одно? Или это как то влияет на целостность данных? softwarerУ меня есть ощущение, что у Вас здорово напутано со связями, но детально разбираться в том виде, в котором приведена диаграмма, нет никакого желания. Они автоматов делались. Главное, что FK правильно стоит, значит и связи наверно в порядке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2008, 00:11 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
karantirКак по вашему, сколько типов достаточно? Типы и таблицы - разные вещи. karantirПоясните пожалуйста в чем здесь проблема? Какая разница два поля в ключе или одно? Или это как то влияет на целостность данных? Как Вам сказать.... представьте себе, что у автомобиля было бы два руля - отдельно на левое и на правое колесо. Для такой конструкции можно придумать применение, но в большинстве случаев это будет неоправданный геморрой. На целостность это может повлиять по-разному. В принципе, это один из путей дополнительного контроля целостности, но из-за усложнения реализации повышается и риск внести ошибку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2008, 01:04 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
karantirсейчас при модификации одного из свойств документа, должно происходить следующее - строка, соответствующая старой ревизии документа, переносится из Documents в Documents_Revisions . - в Documents записывается новая строка с новыми данными о версии документа (кто-когда-откуда изменил) и тем же id_doc. - в Documents_Properties_XXX обновляется строка со старым значением свойства (active_to = <время новой ревизии> (наверно, действительно логичнее сделать FK)). - в Documents_Properties_XXX записывается новая строка c новым значением свойства и ссылкой на новую ревизию документа. Такое поведение характерно скорее для журналирования: пользователь не контролирует значения временнЫх отметок, они создаются автоматически. Версионностью обычно называют контролируемый процесс: пользователь явно указывает временнЫе границы версии и явно выбирает, с какой версией работает. Он также имеет право (в силу смысла приложения ) менять значения свойства для данной версии, каковые изменения в свою очередь могут журналироваться уже на полном автомате. Уточните, что же в данной задачке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2008, 10:14 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
karantirПо третьему пункту. Да вы правы. Такого ограничения сейчас нет. Я правильно понимаю, что запрет на смену id_doctype для созданного документа должен решить проблему? Как это сделать пока не еще не разобрался. Вроде бы надо копать в сторону constraints, так? Спасибо за советы )))karantir, сначала общее соображение. Декларативные ограничения базы данных - суть реализация бизнес-правил прикладной области. Понятно, что сколько бы мы не изощрялись, декларативными средствами postrges или любой другой СУБД мы сможем реализовать лишь часть, причем чем сложнее область тем меньшую часть, этих правил. Конкретно данное ограничение в данной задаче. Нет, запрет изменения одной из таблиц, участвующих в оганичении, суть которого - согласованность значений двух или более таблиц, конечно не поможет. Пример реализации ограничения "тот же самый". Однако из общих соображений, это можно оставить и для приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2008, 10:37 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
ModelRУточните, что же в данной задачке? Версии создаются автоматически каждый раз при внесении правок. Пользователь может изменять только актуальную версию документа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2008, 15:18 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
Тогда ИМХО разделение оправдано, ибо логика транзакций у них другая, особенно если "только" а не "99%". По критерию скорости - postgres кажется умеет сжимать пустые поля, т.е. здесь выигрыша не будет. По логике все же не совсем понятно а для чего вообще versions? В частности, если все на автомате, то как определяется id_docstate? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2008, 19:08 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
И еще один вопрос. Как сделать так, чтобы при выборке свойств документа запрос затрагивал только те таблицы в которых эти свойства реально присутствуют. Т.е. допустим, если документ имеет только три строковых свойства и одно текстовое, не делать join по таблицам для всех типов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2008, 19:12 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
ModelRВ частности, если все на автомате, то как определяется id_docstate? id_docstate определяет состояние документа, имеющее опосредованное отношение к версионности. Служит для организации базового документооборота. Если, допустим, есть документ, который должен пройти несколько инстанций перед окончательным утверждением. Определеяется пользователем. Это если кратко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2008, 19:19 |
|
||
|
Версионный контроль для EAV базы данных
|
|||
|---|---|---|---|
|
#18+
karantirИ еще один вопрос. Как сделать так, чтобы при выборке свойств документа запрос затрагивал только те таблицы в которых эти свойства реально присутствуют. Т.е. допустим, если документ имеет только три строковых свойства и одно текстовое, не делать join по таблицам для всех типов.Ну во-первых join не обязательно . Кроме того запросы могут генерироваться динамически. Наконец, возможно есть какие-то фичи СУБД, но это конечно лучше выяснить на профильном форуме. З.Ы. А softwarer предупреждал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2008, 18:02 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35127100&tid=1544034]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
170ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 509ms |

| 0 / 0 |
