powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Версионный справочник
29 сообщений из 29, показаны все 2 страниц
Версионный справочник
    #32522174
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На идею натолкнул Pavel, хотя, может быть, это давно все используют. А может, и нет...

Описание ситуации:
Имеем справочник клиентов со стандартными полями - ID, Имя, Адрес, Телефон, ОПФ и т. д. Пусть есть так же некий документ, скажем, квитанция. В квитанции идет ссылка на ID клиента и при печати этой самой квитанции выдается вся остальная инфа о клиенте.
Так.
Теперь, если мы меняем адрес у клиента, то все квитанции, которые ссылалсиь на него, при печати выдадут новый адрес. Хотя проводились они в свое время со старым адресом. Нехорошо. Более того - недопустимо. И это касается не только адреса.

Решение.
Делаем версионный справочник клиентов, т.е. есть счетчик, уникальный по всей таблице, есть UIN клиента, есть признак актуальности записи. При изменении любых данных о клиенте запись фактически не меняется, а добавляется новая строка с измененными данными. Все документы, к-ые ссылались на счетчик, сохраняют старые данные о клиенте, а все вновь созданные документы получают ссылку на актуальную запись по данному UIN.

Вопросы.
Насколько работоспособно данное решение? Какие могут быть подводные камни? Кто-нибудь использует подобные версионные справочники в своих проектах?

Буду премного благодарен за любые отзывы.
...
Рейтинг: 0 / 0
Версионный справочник
    #32522232
olk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такие решения используются сплош и рядом :) взять хотя бы ту-же 1с (где используются понятия периодические реквизиты)

Подводные камни тоже есть ...
1. Как учитывать простое редактирование (т.е. реальное исправление не правильно введенных данных)
2. Как устанавливать точку актуализации в справочнике (т.е. допустим период начала действия новой записи)
3. Избыточность данных (если изменился например только адрес клиента, а создается новая запись со всеми атрибутами)
....
Как вариант решения, вывести изменяющиеся реквизиты в отдельную таблицу атрибутов со связью на UIN клиента - но это сильно усложнит доступ к данным ...
предусмотреть возможность "просто" редактирования , т.е. без дублирования записи
...
Рейтинг: 0 / 0
Версионный справочник
    #32522242
Фотография рубль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Был один вариант.
Переодические значение вынес в отдельные таблици. Получилось:
Клиенты: ID, Имя и т.д
Адреса:ID, ID_Клиенты,Дата_актуальности, адрес, телефон и т.д.
При смене адреса, новый адрес добавляется в табличку.
Запрос формируется на определенную дату.
...
Рейтинг: 0 / 0
Версионный справочник
    #32522250
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вести отдельно меняющиеся атрибуты - например адреса. У клиента есть один адрес, текущий. И в квитанции делать ссылку на этот адрес.
Менять можно без проблем - если ошибка.
Если адрес поменялся - добавляем новый, ссылку с клиента на него.

Это будет лучший способ, особенно по производительности.

-- Tygra's --
...
Рейтинг: 0 / 0
Версионный справочник
    #32522261
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2tygra:
В принципе, у меня сейчас так и реализовано. Но вся беда в том, что критично изменение не только адреса, но так же и телефона, ОПФ и т. д. так что же - на каждый реквизит заводить отдельную табличку? Или все-таки проще сделать версионность справочника?
...
Рейтинг: 0 / 0
Версионный справочник
    #32522292
olk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 zz:
В принципе дело вкуса - можно сделать одну таблицу для всех периодических реквизитов, можно разделить таблицы по типам и т.д
Я бы сделал например так:

customer
(
ИД number,
.. постоянные реквизиты ...
)

temp_rekvizit
{
type_rekvizit number, -- тип реквизита
de date, -- дата окончания действия реквизита (если NULL то рабочий)
value varchar2(255) -- значение реквизита (при необходимости в клиентском приложении приводиться к нужному типу)
)
...
Рейтинг: 0 / 0
Версионный справочник
    #32522299
olk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл конечно FK на customer :)

temp_rekvizit
{
type_rekvizit number, -- тип реквизита
de date, -- дата окончания действия реквизита (если NULL то рабочий)
value varchar2(255), -- значение реквизита (при необходимости в клиентском приложении приводиться к нужному типу)
id_customer number
)
...
Рейтинг: 0 / 0
Версионный справочник
    #32522567
Nikola18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Подводные камни тоже есть ...
 1 . Как учитывать простое редактирование (т.е. реальное исправление не правильно введенных данных)
 2 . Как устанавливать точку актуализации в справочнике (т.е. допустим период начала действия новой записи)
 3 . Избыточность данных (если изменился например только адрес клиента, а создается новая запись со всеми атрибутами)
....
Как вариант решения, вывести изменяющиеся реквизиты в отдельную таблицу атрибутов со связью на UIN клиента - но это сильно усложнит доступ к данным ...
предусмотреть возможность "просто" редактирования , т.е. без дублирования записи
Камни эти не такие уж и страшные:
1. Предусмотреть режим просмотра истории с прямым редактированием всех записей текущего объекта.
2. Завести служебное поле ДАТА_ЗАПИСИ - дата, с которой текущая запись актуальна.
3. При правильной и грамотной организации индексов избыточность базы не так сильно влияет на скорость выборок.
Более того, по своему опыту знаю, что количество исправлений объектов, для которых целесообразно создавать хронологию,
не превышет 10-15 в год, иначе надо по другому проектировать базу
(в частности изначально считать новые состояния - новыми объектами).

По такому принципу сейчас и сам проектирую базу.
Пока результаты меня полностью устраивают.
...
Рейтинг: 0 / 0
Версионный справочник
    #32522685
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторБолее того, по своему опыту знаю, что количество исправлений объектов, для которых целесообразно создавать хронологию,
не превышет 10-15 в год, иначе надо по другому проектировать базу

Я вот тоже думаю: ну не так уж часто у клиента будет меняться адрес, телефон или другие реквизиты (никак не 10-15 раз в год). Такую возможность надо предусмотреть, для этого и лепится версионность, но это скорее правило, чем исключение.
...
Рейтинг: 0 / 0
Версионный справочник
    #32522861
awhiler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если нужно только печатать старые квитанции, то существует еще одмн подход - хранить в БД ( в файловой системе на сервере, ...) прямо текст (файл pdf) квитанции.
Этот подход решает сразу все проблемы с возможным изменением любых справочников.
...
Рейтинг: 0 / 0
Версионный справочник
    #32523829
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще один подводный камень - реализация различных отчетов и курсоров по клиентам, тем более за указанный период. При этом вести раздельные атрибуты сразу становится уже далеко не лучшим по производительности способом.

...прямо текст (файл pdf) квитанции.

Квитанция, сформированная из базы - pdf? Это промежуточное решение. Надо прямо в PostScript или в TIFF... :)


Nobody faults but mine... (LZ)
...
Рейтинг: 0 / 0
Версионный справочник
    #32523946
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 aag:
Я ж говорю, у каждого клиента имеется свой UIN, который его и идентифицирует. Для отчетов, статистики и проч. достаточно использовать вьюху с фильтром по актуальной записи и получим стандартный справочник.
...
Рейтинг: 0 / 0
Версионный справочник
    #32525535
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для отчетов, статистики и проч. достаточно использовать вьюху с фильтром по актуальной записи

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

Nobody faults but mine... (LZ)
...
Рейтинг: 0 / 0
Версионный справочник
    #32525607
Фотография snake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Версионный справочник
    #32527333
Фотография Quark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО все с точностью до наоборот

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

Ага, а ошибки оператора не учли? При каждом исправлении ошибки будем записи плодить.

А если фирма пойдет в гору и клиентов будет 30-100тыщ?
А если будете закачивать данные в OLAP и прочие системы.Дополнительные обработки по distinct name клиентов?
А дополнительное место изза такой денормализации?(У вас сейчас 10 полей на контрагента, а завтра 50)

Вспомните для чего была придумана нормализация). А также тот факт что тюнинг денормализации никогда не включал в себя "дублирование" целых записей.
...
Рейтинг: 0 / 0
Версионный справочник
    #32527738
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, можно действительно предусмотреть режим редактирования, о котором говорилось выше, когда данные не меняются, а именно исправляются.

Во-вторых, до OLAP нам еще ой-ей-ей как далеко. И навряд ли вообще когда до него доберемся.

В третьих, изменение данных в справочнике происходит не так уж часто. Я уже говорил, что это скорее исключение из правила. Так что никакого прогнозируемого "внезапного роста" данных даже при объемах в 100 тыщ не будет. Например, при тех же 100 тыщах по моим оценкам избыточных записей будет 10 тыс., т.е. 10%, что не критично.

В четвертых, про какие дополнительные поля вы говорите? Что значит - сегодня 10, а завтра 50??!! Менять структуру таблицы никто не собирается, причем здесь вообще это?

Или я не прав?
...
Рейтинг: 0 / 0
Версионный справочник
    #32527770
olk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщето snake дал вам не плохую ссылку на паттерны, я думаю ничего нового уже придумывать не надо :) выберите то что вам наиболее подходит и просто используйте ...
...
Рейтинг: 0 / 0
Версионный справочник
    #32528161
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме всего выше сказанного,

достаточно часто потребность в "версионности" неоправданна (точнее, обычно задача понимается неправильно)! Например пусть есть квитанция какой-то формы. Я так понимаю у нее есть поля типа адрес клиента, его имя ну и что-то еще. Так вот - дело в том что в данной ситуации никакой версионности скорее всего не нужно - просто нужно понимать что атрибутом данной квитанции является не ссылка на клиента - а фактические данные по этой ссылки на момент создания квитанции! Т.е. смотрите на поле квитанции "адрес клиента" как на собственный атрибут квитанции! Т.е. квитанция некогда не будет следить за изменениями клиента, наоборот, она зафиксирует данные во время своего создания и они, после этого, станут ее частью!

Теперь насчет "версионности" - это отдельный разговор и потребность в ней обычно вытекает из функциональных требование к ИС. Например, если в них явно указано, что требуется вести историю изменения реквизитов клиента.
...
Рейтинг: 0 / 0
Версионный справочник
    #32528355
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 funikovyuri :
Отчего же, такой вариант вполне рассматривался. Но что мы получаем при таком раскладе?

1. В квитанции в полях "Адрес", "Телефон", "Банк", "Расчетный счет" хранить непосредственно Адрес, Телефон и т. д.
Вы представляете, насколько вырастет объем этой таблицы? И никакой нормализации.

2. В квитанции в полях "Адрес", "Телефон", "Банк", "Расчетный счет" хранить IDАдрес, IDТелефон и т. д.
Все хорошо и компактно, но на каждый реквизит придется создавать отедльную таблицу, и построение запросов и отчетов превращается в настоящую пытку. Нормализация чрезмерна. Производительность падает.

Так где же истина?
...
Рейтинг: 0 / 0
Версионный справочник
    #32528372
Фотография snake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zz, прочтите еще раз последний абзац от funikovyuri
...
Рейтинг: 0 / 0
Версионный справочник
    #32528381
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитал.
А вы прочитайте второй.

Автор предлагает заменить версионность своим вариантом. Я описываю трудности, которые могут возникнуть в таком случае. И что в этом неправильного?
...
Рейтинг: 0 / 0
Версионный справочник
    #32528440
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zz

Я понимаю чего вам хочется добиться, но на самом деле сейчас вы, возможно, подменяете одну задачу другой. Подумайте над тем что действительно происходит при создании квитанции. Фактически создается новый объект со своими атрибутами и этот объект не планирует меняться вместе с изменением объектов на основании которых он был построен - потому что он - это нечто новое. Проще всего это представить если думать не об абстрактной квитанции а об ее бумажном эквиваленте.
Например -
вы получили права на машину - где указано что машина черного цвета
вы перекрасили машину в красный
следуя вашей логике в ваших правах цвет машины должен поменяться на красный, но это не так - так как в задачу прав не входит обеспечивать кого-либо актуальной всегда информацией - вместо этого они просто сообщают о состоянии дел на какой-то конкретный момент!

На самом деле можно много примеров привести на эту тему - но все они будут сводиться к тому что задача была подменена. Надо было хранить информацию о квитанции - а вместо этого вы стали хранить историю изменения объектов на которых она была основана! В итоге вы получили усложнение базовых объектов (например, клиента), а также усложнили процесс создания отчетов. Т.е. фактически вы размазали процесс формирования квитанции по времени - так как она у вас не храниться в БД, а , в общем-то, формируется каждый раз по требованию. ИТОГ: вы пришли туда же - но другим, более сложным, путем!

Теперь насчет нормализации - как вы уже должны были понять она в данном случае не причем - так как никаких функциональных зависимостей вы не получили (так как id клиента и адрес клиента теперь полностью независимые атрибуты). Если для вашей задачи необходимо оптимизировать способ хранения квитанций - делайте это (опять же к нормализации это отношения уже не имеет - т.е. не все что повышает эффективность БД - является нормализацией :))
...
Рейтинг: 0 / 0
Версионный справочник
    #32528489
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2funikovyuri:
Всеми силами пытаюсь проникнуься, но пока не получается.

Вы говорите, что ID Клиента и Адрес Клиента - это совершенно несвязанные атрибуты. Допустим. Но что же получается - если я формирую 10 квитанций на некоего Васю Пупкина, где мне брать его адрес? Следуя вашей логике, я должен 10 раз вбить его от руки в квитанцию. Тоже самое касается и др. реквизитов. Зато я, как вы и говорите, буду хранить в БД информацию именно о квитанции.

Извините, я спрашиваю не потому, что хочу покритиковать, а потому, что действительно не понимаю. Если можно, объясните на пальцах конкретную реализацию вашего метода.
...
Рейтинг: 0 / 0
Версионный справочник
    #32528512
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zz

Следуя вашей логике, я должен 10 раз вбить его от руки в квитанцию.

Зачем же - вы берете информацию о клиенте их соответствующего справочника и используете ее, для того чтобы создать новую квитанцию! На этом связь и заканчивается. Т.е. в "связь" существует в момент создания и только
...
Рейтинг: 0 / 0
Версионный справочник
    #32528559
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть просто скопировать текст из поля "Адрес" таблицы "Клиенты" в поле "Адрес" таблицы "Квитанция"
?

Повторюсь еще раз: а не приведет ли это к неоправданному раздуванию таблицы "Квитанция"? Мне кажется, это главный недостаток.

Плюс к тому, в случае ошибки оператора, забившего неверный адрес, придется "обновлять" информацию в каждой из квитанций. Неудобно как-то...
...
Рейтинг: 0 / 0
Версионный справочник
    #32528594
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zz


Плюс к тому, в случае ошибки оператора...
Таков мир - если у человека в паспорте перепутают место жительства ничего страшного у страны не случиться - только у этого человека

Повторюсь еще раз: а не приведет ли это к неоправданному раздуванию таблицы "Квитанция"?

Приведет - и если это для вас критично - оптимизируйте схему хранения квитанции (например, разнеся ее в разные таблицы)

PS> нет идеальных решений - все они - как и указанное мной - компромиссы - на этом и стоим :)
...
Рейтинг: 0 / 0
Версионный справочник
    #32528947
Oracle XPert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то никто не упомянул про введение в таблицы поля "СТАТУС", где можно описать и редактирование, и версионность и т.п.а комбинация "СТАТУС + ДАТА ВНЕСЕНИЯ ЗАПИСИ" достаточна.........
...
Рейтинг: 0 / 0
Версионный справочник
    #32529071
olk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Oracle XPert :
автор Что-то никто не упомянул про введение в таблицы поля "СТАТУС", где можно описать и редактирование, и версионность и т.п.а комбинация "СТАТУС + ДАТА ВНЕСЕНИЯ ЗАПИСИ" достаточна.........
Вообще то изначально речь шла о версионном справочнике ...
и какой статус будет у записи справочника : Октуально либо Нет ? :)) так для этого достаточно только даты октуализации

И основные копия сломали на 3-х позициях (хотя наверное можно предумать еще пару вариантов)

1. Дублировать запись справочника с изменнеными атрибутами
2. Вынести изменямые реквизиты в отдельную таблицу (таблицы)
3. Не вести "версионность" справочника, а переносить изменяемые реквизиты
в "документы" (объекты) исползующие этот справочник ...

По моему все три решения имеют право на жизнь, и выбор оптимального необходимо решать проектировщику на месте, учитывая условия задачи , необходимую степень нормализации и удобство работы и сопровождения
данных объектов
...
Рейтинг: 0 / 0
Версионный справочник
    #32529118
Oracle XPert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sorry! Ho
"Делаем версионный справочник клиентов, т.е. есть счетчик, уникальный по всей таблице, есть UIN клиента, есть признак актуальности записи. При изменении любых данных о клиенте запись фактически не меняется, а добавляется новая строка с измененными данными. Все документы, к-ые ссылались на счетчик, сохраняют старые данные о клиенте, а все вновь созданные документы получают ссылку на актуальную запись по данному UIN.
" prosto ne ponyal srazu.. Tak kak "Все документы, к-ые ссылались на счетчик, сохраняют старые данные о клиенте" i "признак актуальности записи" v odnoi tablize somnitel'no.

Esli est' key::
[ DocID , Date_Created ]+ VersionID + Status + Date_Change
to togda "запись фактически не меняется, а добавляется новая строка с измененными данными" logicheski opravdanna
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Версионный справочник
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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