powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Периодические реквизиты справочников
25 сообщений из 30, страница 1 из 2
Периодические реквизиты справочников
    #34619099
izoldov-roskini
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, поделитесь опытом создания механизма периодических реквизитов ( изменяемых во времени, типа курса валют). Если этих реквизитов в справочнике1,2 и более. Как лючше организовать их хранение и выборку. Есть пока 2 варианта: 1. Все хранить в один столбец с указанием id-реквизита, дата, значение (недостаток, чтобы получить строку со всеми реквизитами, нужно выполнить n-число запросов); 2. Хранить все ревизиты как колонки отдельной таблицы id,дата, рекв1,.... рекв-n.( недостаток, увеличение кол-ва данных, если пользователь меняет один реквизит на новую дату, то должны взяться последние до этой даты и продублироваться, зато скорость выше, 1-запрос - вся строка с реквизитами). Есть у кого-нибуть предложения?
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34619643
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый точно не гут.
Второй вполне может быть, правда возможно получится много лишнего места, один реквизит меняется часто а другой редко. Еесть и другая крайность: для каждого такого реквизита зависти свою таблицу: ИД, Дата, Значение
И сразу появляется промежуточное решение: Сгруппировать ревизиты, которые меняются скорее всего одновременно
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34619685
izoldov-roskini
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, это не катит, я уже думал, слишком геморно
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34619784
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любом случае - дат должно быть 2 - дата начала и дата окончания.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34619963
izoldov-roskini
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дата должна быть одна (начало), а окончанием обычно считается дата след. значения, так вот
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34619988
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
izoldov-roskiniНе, это не катит, я уже думал, слишком геморно
А мне больше нравится, в плане архитектуры
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34619997
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автордата должна быть одна (начало), а окончанием обычно считается дата след. значения, так вот

а я голосую за две даты, это лучше и быстрее при select.

IMHO, Mon$te®
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620018
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4d_monster автордата должна быть одна (начало), а окончанием обычно считается дата след. значения, так вот

а я голосую за две даты, это лучше и быстрее при select.

IMHO, Mon$te®

А я за одну, это быстрее при изменениях и надежней
Да и при Select проблем тоже немного
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620021
izoldov-roskini
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, всетаки дата должна быть одна, при том, что а от куда ты знаешь что например через 2 месяца разряд у рабочего будет другой. И выбирается это очень просто с одной датой:
Код: plaintext
1.
2.
3.
4.
select top ( 1 ) @EmplGrade_id = Grade_id 
from History_Employees 
where History_Employees.RecordDate <= @WorkDate and  Empl_id = @Empl_id
ORDER BY RecordDate DESC;
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620042
Sergey Tokarev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, текущее значение реквизита, и дату его изменения - в таблице, а историю - в отдельной таблице. Можно создать одну общую таблицу истории для всех реквизитов - но это ИМХО изврат.
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620053
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey TokarevЯ думаю, текущее значение реквизита, и дату его изменения - в таблице, а историю - в отдельной таблице. Можно создать одну общую таблицу истории для всех реквизитов - но это ИМХО изврат.
Только надо учитывать, что текущее и самое последнее по дате действия не одно и тоже. Когда нибудь будущее станет настоящим :-)
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620055
izoldov-roskini
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример: помоему в 1С v8, организовано именно так Таблица со статическими рекв. -> к ней таблица истории (там все периодические). Так там регистры устроены. Удобно и быстро. Да есть недостаток в объеме, зато скорость получения n-записи выше, чем валить все реквизиты всех справочников в одну таблицу
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620066
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
izoldov-roskiniПример: помоему в 1С v8, организовано именно так Таблица со статическими рекв. -> к ней таблица истории (там все периодические). Так там регистры устроены. Удобно и быстро. Да есть недостаток в объеме, зато скорость получения n-записи выше, чем валить все реквизиты всех справочников в одну таблицу
Нет там регистр сведений не обязательно хранит все периодические реквизиты, они могут быть разбросаны по разным местам. Именно это я писал в посте №2
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620073
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ось времени бьётся на отрезки, внутри которых значение постоянно.
поэтому я и предполагаю правильным храние границ, а не только начал отрезков.


IMHO, Mon$te®
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620083
izoldov-roskini
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
согласен, но в данном случае не надо тащить 2 поля даты. Достаточно одного, а окончание (правая граница) есть начало следующего отрезка (левая граница). Вот такая цепочка. Я привел кусочек кода, как это можно быстро выбрать. В 1С 8 есть регистры, я имел ввиду периодический регистр сведений
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620088
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4d_monster ось времени бьётся на отрезки, внутри которых значение постоянно.
поэтому я и предполагаю правильным храние границ, а не только начал отрезков.


IMHO, Mon$te®

1. Мы зачастую не знаем, когда закончится время действия отрезка. Закончится когда появится новая запись, тогда нужно будет вставить не только начало нового значения, но и конец старого, который по-моему уже не так важен (он вычисляется из начала нового)
2. При удалении промежуточного значения либо появится "дыра", либо придется модифицировать данные. В случае одной даты, менять ничего не надо, предыдущий интервал "поглотит" его автоматом
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620101
izoldov-roskini
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Истину глаголит человек, респект ему
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620104
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. +-INF приравнять к NULL
Да, при изменении отрезков, надо изменять соседний

2. я не сталкивался с ситуацией удаления самого отрезка.

IMHO, Mon$te®
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620119
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4d_monster1. +-INF приравнять к NULL
Да, при изменении отрезков, надо изменять соседний

2. я не сталкивался с ситуацией удаления самого отрезка.

IMHO, Mon$te®

1. я понимаю, что решение всегда найдется и с 2 датами, но какие преимущества дает такой поход? чем же он все таки лучше? вы показали что решить укаанную проблему можно, а мне ее решать вообще не надо
2. бывают, что люди ошибаются: приказ не той датой внес или он вообще не нужен или не для этого объекта
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620128
izoldov-roskini
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или например сменили разряд, а потом удалили
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620246
Фотография 4d_monster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторя понимаю, что решение всегда найдется и с 2 датами, но какие преимущества дает такой поход? чем же он все таки лучше? вы показали что решить укаанную проблему можно, а мне ее решать вообще не надо
аргументировать могу только таким-же стилем:
Код: plaintext
1.
2.
3.
select top ( 1 ) @EmplGrade_id = Grade_id 
from History_Employees 
where History_Employees.RecordDate <= @WorkDate and  Empl_id = @Empl_id
ORDER BY RecordDate DESC;
а тут просто <= <= и COALESCE (NZ)
автор2. бывают, что люди ошибаются: приказ не той датой внес или он вообще не нужен или не для этого объекта
опять же, если это например касается ИНН/КПП или ФИО директора, должна быть возможность или добавлять новые отрезки, или изменять значения на старых.

авторили например сменили разряд, а потом удалили
а если уже прошло начисление, которое рассчитывалось на основе того - удалённого разряда?

IMHO, Mon$te®
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620262
izoldov-roskini
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот для таких вещей есть закрытие периода и все такое, воторое пересчитывает данные, дабы исключить ошибки и все прочее
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620268
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4d_monster
а если уже прошло начисление, которое рассчитывалось на основе того - удалённого разряда?
IMHO, Mon$te®

Ни одна из приведенных схем не спасет - нужно будет модифицировать данные, да и в принипе понятно, что этот случай не лечится никакой схемой и к данной теме мало относится
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620300
izoldov-roskini
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обобщая сказанное есть 5 путей:
1. Хранить все реквизиты в разных таблицах (грамоздко, долго выполнимо)
2. Хранить все реквизиты в одной таблице (громоздко, сильное дублирование)
3. Хранить все реквизиты одной таблицы в отдельной таблице с указанием одно даты (схема как в 1С 8) (немного дублирования)
4. Хранить реквизиты в одной таблице типа : id, date,recv_id,value (подход как в 1С 7, для того чтобы получить строку например по сотруднику (оклад, разряд, ставка) - надо выполнить 3 запроса, долго)
5. Хранить как п.3 только с отрезком Дата С - Дата По (несовсем понятен смысл окончания отрезка, по моему лишний). Всем спасибо. В общем картина ясна. Лично я использую 3-й вариант. Быстро, удобно.
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34620576
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Формально дата По лишняя, кроме того случая, когда период действия данных завершается окончательно. На практике интервал [С, По] позволяет упростить выборки нужных строк из таблиц, например писать sysdate between С and ПО, вместо конструкций с подзапросами min/max.
Кроме того индекстирование по ключу (ID, С, ПО), позволяет находить ROWID нужной строки только путём сканирования индекса по диапазону не обращаясь к сегменту таблицы. В результате существенно сокращается количество логических чтений и увеличивается производительность запросов.

Делить отношение на таблицы по принципу изменяемые/неизменяемые атрибуты, тем более выделять отдельные колонки нет смысла. На соединениях в запросах потеряешь больше, а определить какой атрибут изменился очень просто сравнив поля в соседних записях.

Самая главная проблема это ввод первичных данных.
Практика показывает, что возьня с датами, а тем более с интервалами сильно усложняет работу оператора и логику приложения (нужно отслеживать пересечения интервалов, правильно делать блокировки, исправление ошибок становится нетривиальной задачей и т.д.). Решением может быть создание Front-end подсистемы для заведения первичных данных, в виде максимально приближенном к формату источника. Затем после заведения и проверки данных нужно отразить их в исторические записи, пригодные для удобного использования во многих подсистемах. Кроме того нужно предусмотреть операцию исправления первичных данных, если в них обнаружились ошибки, и повторного применения в историческую подсистему.
Часто новая версия документа отличается от предыдущей только датой вступления в силу и изменениями нескольких строк или полей. В этом случае полезно иметь функцию создания новой версии документа по образцу существующей версии. В связи с этим возникает интересная задача трассировки версий, например для поиска и исправления растиражированных ошибок (вспомним Copy/Paste ).
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Периодические реквизиты справочников
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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