|
|
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
Народ, поделитесь опытом создания механизма периодических реквизитов ( изменяемых во времени, типа курса валют). Если этих реквизитов в справочнике1,2 и более. Как лючше организовать их хранение и выборку. Есть пока 2 варианта: 1. Все хранить в один столбец с указанием id-реквизита, дата, значение (недостаток, чтобы получить строку со всеми реквизитами, нужно выполнить n-число запросов); 2. Хранить все ревизиты как колонки отдельной таблицы id,дата, рекв1,.... рекв-n.( недостаток, увеличение кол-ва данных, если пользователь меняет один реквизит на новую дату, то должны взяться последние до этой даты и продублироваться, зато скорость выше, 1-запрос - вся строка с реквизитами). Есть у кого-нибуть предложения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 09:39 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
Первый точно не гут. Второй вполне может быть, правда возможно получится много лишнего места, один реквизит меняется часто а другой редко. Еесть и другая крайность: для каждого такого реквизита зависти свою таблицу: ИД, Дата, Значение И сразу появляется промежуточное решение: Сгруппировать ревизиты, которые меняются скорее всего одновременно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 12:08 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
Не, это не катит, я уже думал, слишком геморно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 12:18 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
В любом случае - дат должно быть 2 - дата начала и дата окончания. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 12:42 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
дата должна быть одна (начало), а окончанием обычно считается дата след. значения, так вот ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 13:29 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
izoldov-roskiniНе, это не катит, я уже думал, слишком геморно А мне больше нравится, в плане архитектуры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 13:35 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
автордата должна быть одна (начало), а окончанием обычно считается дата след. значения, так вот а я голосую за две даты, это лучше и быстрее при select. IMHO, Mon$te® ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 13:36 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
4d_monster автордата должна быть одна (начало), а окончанием обычно считается дата след. значения, так вот а я голосую за две даты, это лучше и быстрее при select. IMHO, Mon$te® А я за одну, это быстрее при изменениях и надежней Да и при Select проблем тоже немного ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 13:41 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
Нет, всетаки дата должна быть одна, при том, что а от куда ты знаешь что например через 2 месяца разряд у рабочего будет другой. И выбирается это очень просто с одной датой: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 13:42 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
Я думаю, текущее значение реквизита, и дату его изменения - в таблице, а историю - в отдельной таблице. Можно создать одну общую таблицу истории для всех реквизитов - но это ИМХО изврат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 13:47 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
Sergey TokarevЯ думаю, текущее значение реквизита, и дату его изменения - в таблице, а историю - в отдельной таблице. Можно создать одну общую таблицу истории для всех реквизитов - но это ИМХО изврат. Только надо учитывать, что текущее и самое последнее по дате действия не одно и тоже. Когда нибудь будущее станет настоящим :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 13:50 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
Пример: помоему в 1С v8, организовано именно так Таблица со статическими рекв. -> к ней таблица истории (там все периодические). Так там регистры устроены. Удобно и быстро. Да есть недостаток в объеме, зато скорость получения n-записи выше, чем валить все реквизиты всех справочников в одну таблицу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 13:51 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
izoldov-roskiniПример: помоему в 1С v8, организовано именно так Таблица со статическими рекв. -> к ней таблица истории (там все периодические). Так там регистры устроены. Удобно и быстро. Да есть недостаток в объеме, зато скорость получения n-записи выше, чем валить все реквизиты всех справочников в одну таблицу Нет там регистр сведений не обязательно хранит все периодические реквизиты, они могут быть разбросаны по разным местам. Именно это я писал в посте №2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 13:55 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
ось времени бьётся на отрезки, внутри которых значение постоянно. поэтому я и предполагаю правильным храние границ, а не только начал отрезков. IMHO, Mon$te® ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 13:56 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
согласен, но в данном случае не надо тащить 2 поля даты. Достаточно одного, а окончание (правая граница) есть начало следующего отрезка (левая граница). Вот такая цепочка. Я привел кусочек кода, как это можно быстро выбрать. В 1С 8 есть регистры, я имел ввиду периодический регистр сведений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 13:59 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
4d_monster ось времени бьётся на отрезки, внутри которых значение постоянно. поэтому я и предполагаю правильным храние границ, а не только начал отрезков. IMHO, Mon$te® 1. Мы зачастую не знаем, когда закончится время действия отрезка. Закончится когда появится новая запись, тогда нужно будет вставить не только начало нового значения, но и конец старого, который по-моему уже не так важен (он вычисляется из начала нового) 2. При удалении промежуточного значения либо появится "дыра", либо придется модифицировать данные. В случае одной даты, менять ничего не надо, предыдущий интервал "поглотит" его автоматом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 14:00 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
Истину глаголит человек, респект ему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 14:03 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
1. +-INF приравнять к NULL Да, при изменении отрезков, надо изменять соседний 2. я не сталкивался с ситуацией удаления самого отрезка. IMHO, Mon$te® ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 14:04 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
4d_monster1. +-INF приравнять к NULL Да, при изменении отрезков, надо изменять соседний 2. я не сталкивался с ситуацией удаления самого отрезка. IMHO, Mon$te® 1. я понимаю, что решение всегда найдется и с 2 датами, но какие преимущества дает такой поход? чем же он все таки лучше? вы показали что решить укаанную проблему можно, а мне ее решать вообще не надо 2. бывают, что люди ошибаются: приказ не той датой внес или он вообще не нужен или не для этого объекта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 14:09 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
или например сменили разряд, а потом удалили ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 14:10 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
авторя понимаю, что решение всегда найдется и с 2 датами, но какие преимущества дает такой поход? чем же он все таки лучше? вы показали что решить укаанную проблему можно, а мне ее решать вообще не надо аргументировать могу только таким-же стилем: Код: plaintext 1. 2. 3. автор2. бывают, что люди ошибаются: приказ не той датой внес или он вообще не нужен или не для этого объекта опять же, если это например касается ИНН/КПП или ФИО директора, должна быть возможность или добавлять новые отрезки, или изменять значения на старых. авторили например сменили разряд, а потом удалили а если уже прошло начисление, которое рассчитывалось на основе того - удалённого разряда? IMHO, Mon$te® ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 14:43 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
А вот для таких вещей есть закрытие периода и все такое, воторое пересчитывает данные, дабы исключить ошибки и все прочее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 14:47 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
4d_monster а если уже прошло начисление, которое рассчитывалось на основе того - удалённого разряда? IMHO, Mon$te® Ни одна из приведенных схем не спасет - нужно будет модифицировать данные, да и в принипе понятно, что этот случай не лечится никакой схемой и к данной теме мало относится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 14:49 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
Обобщая сказанное есть 5 путей: 1. Хранить все реквизиты в разных таблицах (грамоздко, долго выполнимо) 2. Хранить все реквизиты в одной таблице (громоздко, сильное дублирование) 3. Хранить все реквизиты одной таблицы в отдельной таблице с указанием одно даты (схема как в 1С 8) (немного дублирования) 4. Хранить реквизиты в одной таблице типа : id, date,recv_id,value (подход как в 1С 7, для того чтобы получить строку например по сотруднику (оклад, разряд, ставка) - надо выполнить 3 запроса, долго) 5. Хранить как п.3 только с отрезком Дата С - Дата По (несовсем понятен смысл окончания отрезка, по моему лишний). Всем спасибо. В общем картина ясна. Лично я использую 3-й вариант. Быстро, удобно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 14:56 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
Формально дата По лишняя, кроме того случая, когда период действия данных завершается окончательно. На практике интервал [С, По] позволяет упростить выборки нужных строк из таблиц, например писать sysdate between С and ПО, вместо конструкций с подзапросами min/max. Кроме того индекстирование по ключу (ID, С, ПО), позволяет находить ROWID нужной строки только путём сканирования индекса по диапазону не обращаясь к сегменту таблицы. В результате существенно сокращается количество логических чтений и увеличивается производительность запросов. Делить отношение на таблицы по принципу изменяемые/неизменяемые атрибуты, тем более выделять отдельные колонки нет смысла. На соединениях в запросах потеряешь больше, а определить какой атрибут изменился очень просто сравнив поля в соседних записях. Самая главная проблема это ввод первичных данных. Практика показывает, что возьня с датами, а тем более с интервалами сильно усложняет работу оператора и логику приложения (нужно отслеживать пересечения интервалов, правильно делать блокировки, исправление ошибок становится нетривиальной задачей и т.д.). Решением может быть создание Front-end подсистемы для заведения первичных данных, в виде максимально приближенном к формату источника. Затем после заведения и проверки данных нужно отразить их в исторические записи, пригодные для удобного использования во многих подсистемах. Кроме того нужно предусмотреть операцию исправления первичных данных, если в них обнаружились ошибки, и повторного применения в историческую подсистему. Часто новая версия документа отличается от предыдущей только датой вступления в силу и изменениями нескольких строк или полей. В этом случае полезно иметь функцию создания новой версии документа по образцу существующей версии. В связи с этим возникает интересная задача трассировки версий, например для поиска и исправления растиражированных ошибок (вспомним Copy/Paste ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 16:04 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
Собраны подходы к хранению хронологических данных http://www.arbinada.com/modules.php?name=News&file=article&sid=91 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 16:22 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
Я бы хранил каждый периодический реквизит в отдельной таблице вида Реквизит(ДатаНачала, ДатаОкончания, IDРодителя, Значение) Если ДатаОкончания не указана, значит ее или нет, или это ДатаНачала следующего значения минус 1 день (час/минута/секунда зависит от задач). Например, Клиент(Ид, НепериодическиеАтрибуты) НДС(ДатаНачала, ДатаОкончания, ИдКлиента, Значение) - история работы клиентов с НДС (являлись плательщиками, не являлись). Договора(ИдДоговора, ИдКлиента, ПрочиеАтрибуты) - история договоров (кто-то может сказать, что это не история, а простой справочник договоров, но я отвечу, что в данном случае это одно и то же, ведь договора тоже заключаются на временной шкале, значит имеет место история), в ПрочихАтрибутах я скрыл даты. Почему мы не включаем все (!) атрибуты договоров сразу в справочник Клиентов? Потому что есть понятие нормализации, и мне даже в голову не приходит складывать все в одну таблицу. А разделяя отношения на более мелкие таблицы мы уходим от избыточности (в справочнике Клиентов лежат данные только о клиентах, записанные единожды и не повторяющиеся из кортежа в кортеж). Уж не знаю сколько милисекунд мы потеряем на соединениях, однако красота схемы заставит нас впасть в нирвану. Почему бы я выбрал хранение каждого вида реквизита в отдельной таблице? Люблю порядок. Любая сущность реального мира должна быть представлена отдельной сущностью базы данных. И если я захочу выбрать НДС, то посмотрю нужное значение в таблице НДС. А вообще тут зависит от предметной области. Если периодических атрибутов слишком много, то возможно и правда удобнее хранить их в одной таблице, чтобы не загромождать схему, выставив предварительно в отношении признак ТипАтрибута (правда тогда надо будет еще сделать справочник ТипыАтрибутов, опять же чтобы избыточность не плодить). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2007, 23:38 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
NFЕсли ДатаОкончания не указана, значит ее или нет, или это ДатаНачала следующего значения минус 1 день (час/минута/секунда зависит от задач). Будь проще. Прикинь как будут выглядеть SQL запросы со всеми этими заморочками! Заколебёшься предикаты выписывать. NFПотому что есть понятие нормализации Нормализация тут не при чём. Ты предлагаешь заменить большой повторяющийся блок данных коротким числом. Это не есть нормализация, поскольку эта процедура не имеет цели устранить какую либо функциональную зависимость. Это кодирование данных с целью уменьшения занимаемого ими объёма памяти и не более того. NFоднако красота схемы заставит нас впасть в нирвану. Боюсь, от такой красоты в нирвану впадёт СУБД и будет в ней пребывать неопределённо долго. NFЕсли периодических атрибутов слишком много, то возможно и правда удобнее хранить их в одной таблице, чтобы не загромождать схему, выставив предварительно в отношении признак ТипАтрибута (правда тогда надо будет еще сделать справочник ТипыАтрибутов, опять же чтобы избыточность не плодить). Это EAV со всеми вытекающими последствиями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2007, 16:38 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
NFПочему бы я выбрал хранение каждого вида реквизита в отдельной таблице?Про хранение в одной таблице и в многих таблицах - много было сказано здесь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2007, 17:02 |
|
||
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#18+
izoldov-roskini<...>1. Все хранить в один столбец с указанием id-реквизита, дата, значение (недостаток, чтобы получить строку со всеми реквизитами, нужно выполнить n-число запросов); Я когда-то использовал именно этот способ. Причём без даты "до". Вполне прилично работало. izoldov-roskini 2. Хранить все ревизиты как колонки отдельной таблицы id,дата, рекв1,.... рекв-n.( недостаток, увеличение кол-ва данных, если пользователь меняет один реквизит на новую дату, то должны взяться последние до этой даты и продублироваться, зато скорость выше, 1-запрос - вся строка с реквизитами). <...> Если количество и состав реквизитов изначально известны, а реквизиты изменяются все вместе, как курсы валют ММВБ - хороший способ. Если не все вместе, часто, да ещё и количество и состав их изменяется - так себе способ, таблица будет быстро расти. Хотя, учитывая современное железо и СУБД, система даже таким способом сможет хранить информацию за достаточно длительный период времени, может, этого для решения Вашей задачи вполне достаточно. А вообще Вам нужно поискать по словам "хранение темпоральных данных", "темпоральные БД". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2007, 13:19 |
|
||
|
|

start [/forum/topic.php?all=1&fid=32&tid=1544428]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
55ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 320ms |

| 0 / 0 |
