powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Периодические реквизиты справочников
30 сообщений из 30, показаны все 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
Периодические реквизиты справочников
    #34620660
sqllex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собраны подходы к хранению хронологических данных
http://www.arbinada.com/modules.php?name=News&file=article&sid=91
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34621600
NF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NF
Гость
Я бы хранил каждый периодический реквизит в отдельной таблице вида

Реквизит(ДатаНачала, ДатаОкончания, IDРодителя, Значение)

Если ДатаОкончания не указана, значит ее или нет, или это ДатаНачала следующего значения минус 1 день (час/минута/секунда зависит от задач).

Например,
Клиент(Ид, НепериодическиеАтрибуты)
НДС(ДатаНачала, ДатаОкончания, ИдКлиента, Значение) - история работы клиентов с НДС (являлись плательщиками, не являлись).
Договора(ИдДоговора, ИдКлиента, ПрочиеАтрибуты) - история договоров (кто-то может сказать, что это не история, а простой справочник договоров, но я отвечу, что в данном случае это одно и то же, ведь договора тоже заключаются на временной шкале, значит имеет место история), в ПрочихАтрибутах я скрыл даты.
Почему мы не включаем все (!) атрибуты договоров сразу в справочник Клиентов? Потому что есть понятие нормализации, и мне даже в голову не приходит складывать все в одну таблицу. А разделяя отношения на более мелкие таблицы мы уходим от избыточности (в справочнике Клиентов лежат данные только о клиентах, записанные единожды и не повторяющиеся из кортежа в кортеж). Уж не знаю сколько милисекунд мы потеряем на соединениях, однако красота схемы заставит нас впасть в нирвану.

Почему бы я выбрал хранение каждого вида реквизита в отдельной таблице? Люблю порядок. Любая сущность реального мира должна быть представлена отдельной сущностью базы данных. И если я захочу выбрать НДС, то посмотрю нужное значение в таблице НДС. А вообще тут зависит от предметной области. Если периодических атрибутов слишком много, то возможно и правда удобнее хранить их в одной таблице, чтобы не загромождать схему, выставив предварительно в отношении признак ТипАтрибута (правда тогда надо будет еще сделать справочник ТипыАтрибутов, опять же чтобы избыточность не плодить).
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34624005
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NFЕсли ДатаОкончания не указана, значит ее или нет, или это ДатаНачала следующего значения минус 1 день (час/минута/секунда зависит от задач).

Будь проще. Прикинь как будут выглядеть SQL запросы со всеми этими заморочками! Заколебёшься предикаты выписывать.

NFПотому что есть понятие нормализации

Нормализация тут не при чём. Ты предлагаешь заменить большой повторяющийся блок данных коротким числом. Это не есть нормализация, поскольку эта процедура не имеет цели устранить какую либо функциональную зависимость. Это кодирование данных с целью уменьшения занимаемого ими объёма памяти и не более того.

NFоднако красота схемы заставит нас впасть в нирвану.

Боюсь, от такой красоты в нирвану впадёт СУБД и будет в ней пребывать неопределённо долго.

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

Это EAV со всеми вытекающими последствиями.
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34624112
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NFПочему бы я выбрал хранение каждого вида реквизита в отдельной таблице?Про хранение в одной таблице и в многих таблицах - много было сказано здесь
...
Рейтинг: 0 / 0
Периодические реквизиты справочников
    #34625947
AlexTheRaven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
izoldov-roskini<...>1. Все хранить в один столбец с указанием id-реквизита, дата, значение (недостаток, чтобы получить строку со всеми реквизитами, нужно выполнить n-число запросов); Я когда-то использовал именно этот способ. Причём без даты "до". Вполне прилично работало.
izoldov-roskini
2. Хранить все ревизиты как колонки отдельной таблицы id,дата, рекв1,.... рекв-n.( недостаток, увеличение кол-ва данных, если пользователь меняет один реквизит на новую дату, то должны взяться последние до этой даты и продублироваться, зато скорость выше, 1-запрос - вся строка с реквизитами). <...> Если количество и состав реквизитов изначально известны, а реквизиты изменяются все вместе, как курсы валют ММВБ - хороший способ. Если не все вместе, часто, да ещё и количество и состав их изменяется - так себе способ, таблица будет быстро расти. Хотя, учитывая современное железо и СУБД, система даже таким способом сможет хранить информацию за достаточно длительный период времени, может, этого для решения Вашей задачи вполне достаточно.

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


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