Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
На идею натолкнул Pavel, хотя, может быть, это давно все используют. А может, и нет... Описание ситуации: Имеем справочник клиентов со стандартными полями - ID, Имя, Адрес, Телефон, ОПФ и т. д. Пусть есть так же некий документ, скажем, квитанция. В квитанции идет ссылка на ID клиента и при печати этой самой квитанции выдается вся остальная инфа о клиенте. Так. Теперь, если мы меняем адрес у клиента, то все квитанции, которые ссылалсиь на него, при печати выдадут новый адрес. Хотя проводились они в свое время со старым адресом. Нехорошо. Более того - недопустимо. И это касается не только адреса. Решение. Делаем версионный справочник клиентов, т.е. есть счетчик, уникальный по всей таблице, есть UIN клиента, есть признак актуальности записи. При изменении любых данных о клиенте запись фактически не меняется, а добавляется новая строка с измененными данными. Все документы, к-ые ссылались на счетчик, сохраняют старые данные о клиенте, а все вновь созданные документы получают ссылку на актуальную запись по данному UIN. Вопросы. Насколько работоспособно данное решение? Какие могут быть подводные камни? Кто-нибудь использует подобные версионные справочники в своих проектах? Буду премного благодарен за любые отзывы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 13:57 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
Такие решения используются сплош и рядом :) взять хотя бы ту-же 1с (где используются понятия периодические реквизиты) Подводные камни тоже есть ... 1. Как учитывать простое редактирование (т.е. реальное исправление не правильно введенных данных) 2. Как устанавливать точку актуализации в справочнике (т.е. допустим период начала действия новой записи) 3. Избыточность данных (если изменился например только адрес клиента, а создается новая запись со всеми атрибутами) .... Как вариант решения, вывести изменяющиеся реквизиты в отдельную таблицу атрибутов со связью на UIN клиента - но это сильно усложнит доступ к данным ... предусмотреть возможность "просто" редактирования , т.е. без дублирования записи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 14:10 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
Был один вариант. Переодические значение вынес в отдельные таблици. Получилось: Клиенты: ID, Имя и т.д Адреса:ID, ID_Клиенты,Дата_актуальности, адрес, телефон и т.д. При смене адреса, новый адрес добавляется в табличку. Запрос формируется на определенную дату. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 14:12 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
Вести отдельно меняющиеся атрибуты - например адреса. У клиента есть один адрес, текущий. И в квитанции делать ссылку на этот адрес. Менять можно без проблем - если ошибка. Если адрес поменялся - добавляем новый, ссылку с клиента на него. Это будет лучший способ, особенно по производительности. -- Tygra's -- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 14:14 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
2tygra: В принципе, у меня сейчас так и реализовано. Но вся беда в том, что критично изменение не только адреса, но так же и телефона, ОПФ и т. д. так что же - на каждый реквизит заводить отдельную табличку? Или все-таки проще сделать версионность справочника? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 14:17 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
2 zz: В принципе дело вкуса - можно сделать одну таблицу для всех периодических реквизитов, можно разделить таблицы по типам и т.д Я бы сделал например так: customer ( ИД number, .. постоянные реквизиты ... ) temp_rekvizit { type_rekvizit number, -- тип реквизита de date, -- дата окончания действия реквизита (если NULL то рабочий) value varchar2(255) -- значение реквизита (при необходимости в клиентском приложении приводиться к нужному типу) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 14:26 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
забыл конечно FK на customer :) temp_rekvizit { type_rekvizit number, -- тип реквизита de date, -- дата окончания действия реквизита (если NULL то рабочий) value varchar2(255), -- значение реквизита (при необходимости в клиентском приложении приводиться к нужному типу) id_customer number ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 14:27 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 1. Предусмотреть режим просмотра истории с прямым редактированием всех записей текущего объекта. 2. Завести служебное поле ДАТА_ЗАПИСИ - дата, с которой текущая запись актуальна. 3. При правильной и грамотной организации индексов избыточность базы не так сильно влияет на скорость выборок. Более того, по своему опыту знаю, что количество исправлений объектов, для которых целесообразно создавать хронологию, не превышет 10-15 в год, иначе надо по другому проектировать базу (в частности изначально считать новые состояния - новыми объектами). По такому принципу сейчас и сам проектирую базу. Пока результаты меня полностью устраивают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 16:10 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
авторБолее того, по своему опыту знаю, что количество исправлений объектов, для которых целесообразно создавать хронологию, не превышет 10-15 в год, иначе надо по другому проектировать базу Я вот тоже думаю: ну не так уж часто у клиента будет меняться адрес, телефон или другие реквизиты (никак не 10-15 раз в год). Такую возможность надо предусмотреть, для этого и лепится версионность, но это скорее правило, чем исключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 17:05 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
Если нужно только печатать старые квитанции, то существует еще одмн подход - хранить в БД ( в файловой системе на сервере, ...) прямо текст (файл pdf) квитанции. Этот подход решает сразу все проблемы с возможным изменением любых справочников. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2004, 18:32 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
еще один подводный камень - реализация различных отчетов и курсоров по клиентам, тем более за указанный период. При этом вести раздельные атрибуты сразу становится уже далеко не лучшим по производительности способом. ...прямо текст (файл pdf) квитанции. Квитанция, сформированная из базы - pdf? Это промежуточное решение. Надо прямо в PostScript или в TIFF... :) Nobody faults but mine... (LZ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2004, 13:17 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
2 aag: Я ж говорю, у каждого клиента имеется свой UIN, который его и идентифицирует. Для отчетов, статистики и проч. достаточно использовать вьюху с фильтром по актуальной записи и получим стандартный справочник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2004, 14:01 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
Для отчетов, статистики и проч. достаточно использовать вьюху с фильтром по актуальной записи Если под актуальной записью понимать получение последней записи на заданную дату - то достаточно. Только для структуры с раздельными атрибутами это через вьюху сделать уже непросто. Nobody faults but mine... (LZ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2004, 11:24 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
ИМХО все с точностью до наоборот авторПри изменении любых данных о клиенте запись фактически не меняется, а добавляется новая строка с измененными данными. Ага, а ошибки оператора не учли? При каждом исправлении ошибки будем записи плодить. А если фирма пойдет в гору и клиентов будет 30-100тыщ? А если будете закачивать данные в OLAP и прочие системы.Дополнительные обработки по distinct name клиентов? А дополнительное место изза такой денормализации?(У вас сейчас 10 полей на контрагента, а завтра 50) Вспомните для чего была придумана нормализация). А также тот факт что тюнинг денормализации никогда не включал в себя "дублирование" целых записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 08:18 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
Во-первых, можно действительно предусмотреть режим редактирования, о котором говорилось выше, когда данные не меняются, а именно исправляются. Во-вторых, до OLAP нам еще ой-ей-ей как далеко. И навряд ли вообще когда до него доберемся. В третьих, изменение данных в справочнике происходит не так уж часто. Я уже говорил, что это скорее исключение из правила. Так что никакого прогнозируемого "внезапного роста" данных даже при объемах в 100 тыщ не будет. Например, при тех же 100 тыщах по моим оценкам избыточных записей будет 10 тыс., т.е. 10%, что не критично. В четвертых, про какие дополнительные поля вы говорите? Что значит - сегодня 10, а завтра 50??!! Менять структуру таблицы никто не собирается, причем здесь вообще это? Или я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 11:38 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
Вообщето snake дал вам не плохую ссылку на паттерны, я думаю ничего нового уже придумывать не надо :) выберите то что вам наиболее подходит и просто используйте ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 11:53 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
Кроме всего выше сказанного, достаточно часто потребность в "версионности" неоправданна (точнее, обычно задача понимается неправильно)! Например пусть есть квитанция какой-то формы. Я так понимаю у нее есть поля типа адрес клиента, его имя ну и что-то еще. Так вот - дело в том что в данной ситуации никакой версионности скорее всего не нужно - просто нужно понимать что атрибутом данной квитанции является не ссылка на клиента - а фактические данные по этой ссылки на момент создания квитанции! Т.е. смотрите на поле квитанции "адрес клиента" как на собственный атрибут квитанции! Т.е. квитанция некогда не будет следить за изменениями клиента, наоборот, она зафиксирует данные во время своего создания и они, после этого, станут ее частью! Теперь насчет "версионности" - это отдельный разговор и потребность в ней обычно вытекает из функциональных требование к ИС. Например, если в них явно указано, что требуется вести историю изменения реквизитов клиента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 14:05 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
2 funikovyuri : Отчего же, такой вариант вполне рассматривался. Но что мы получаем при таком раскладе? 1. В квитанции в полях "Адрес", "Телефон", "Банк", "Расчетный счет" хранить непосредственно Адрес, Телефон и т. д. Вы представляете, насколько вырастет объем этой таблицы? И никакой нормализации. 2. В квитанции в полях "Адрес", "Телефон", "Банк", "Расчетный счет" хранить IDАдрес, IDТелефон и т. д. Все хорошо и компактно, но на каждый реквизит придется создавать отедльную таблицу, и построение запросов и отчетов превращается в настоящую пытку. Нормализация чрезмерна. Производительность падает. Так где же истина? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 15:02 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
zz, прочтите еще раз последний абзац от funikovyuri ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 15:07 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
Прочитал. А вы прочитайте второй. Автор предлагает заменить версионность своим вариантом. Я описываю трудности, которые могут возникнуть в таком случае. И что в этом неправильного? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 15:11 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
zz Я понимаю чего вам хочется добиться, но на самом деле сейчас вы, возможно, подменяете одну задачу другой. Подумайте над тем что действительно происходит при создании квитанции. Фактически создается новый объект со своими атрибутами и этот объект не планирует меняться вместе с изменением объектов на основании которых он был построен - потому что он - это нечто новое. Проще всего это представить если думать не об абстрактной квитанции а об ее бумажном эквиваленте. Например - вы получили права на машину - где указано что машина черного цвета вы перекрасили машину в красный следуя вашей логике в ваших правах цвет машины должен поменяться на красный, но это не так - так как в задачу прав не входит обеспечивать кого-либо актуальной всегда информацией - вместо этого они просто сообщают о состоянии дел на какой-то конкретный момент! На самом деле можно много примеров привести на эту тему - но все они будут сводиться к тому что задача была подменена. Надо было хранить информацию о квитанции - а вместо этого вы стали хранить историю изменения объектов на которых она была основана! В итоге вы получили усложнение базовых объектов (например, клиента), а также усложнили процесс создания отчетов. Т.е. фактически вы размазали процесс формирования квитанции по времени - так как она у вас не храниться в БД, а , в общем-то, формируется каждый раз по требованию. ИТОГ: вы пришли туда же - но другим, более сложным, путем! Теперь насчет нормализации - как вы уже должны были понять она в данном случае не причем - так как никаких функциональных зависимостей вы не получили (так как id клиента и адрес клиента теперь полностью независимые атрибуты). Если для вашей задачи необходимо оптимизировать способ хранения квитанций - делайте это (опять же к нормализации это отношения уже не имеет - т.е. не все что повышает эффективность БД - является нормализацией :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 15:26 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
2funikovyuri: Всеми силами пытаюсь проникнуься, но пока не получается. Вы говорите, что ID Клиента и Адрес Клиента - это совершенно несвязанные атрибуты. Допустим. Но что же получается - если я формирую 10 квитанций на некоего Васю Пупкина, где мне брать его адрес? Следуя вашей логике, я должен 10 раз вбить его от руки в квитанцию. Тоже самое касается и др. реквизитов. Зато я, как вы и говорите, буду хранить в БД информацию именно о квитанции. Извините, я спрашиваю не потому, что хочу покритиковать, а потому, что действительно не понимаю. Если можно, объясните на пальцах конкретную реализацию вашего метода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 15:39 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
zz Следуя вашей логике, я должен 10 раз вбить его от руки в квитанцию. Зачем же - вы берете информацию о клиенте их соответствующего справочника и используете ее, для того чтобы создать новую квитанцию! На этом связь и заканчивается. Т.е. в "связь" существует в момент создания и только ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 15:44 |
|
||
|
Версионный справочник
|
|||
|---|---|---|---|
|
#18+
То есть просто скопировать текст из поля "Адрес" таблицы "Клиенты" в поле "Адрес" таблицы "Квитанция" ? Повторюсь еще раз: а не приведет ли это к неоправданному раздуванию таблицы "Квитанция"? Мне кажется, это главный недостаток. Плюс к тому, в случае ошибки оператора, забившего неверный адрес, придется "обновлять" информацию в каждой из квитанций. Неудобно как-то... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 15:55 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=32523829&tid=1546471]: |
0ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
155ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 231ms |
| total: | 509ms |

| 0 / 0 |
