|
|
|
Периодические реквизиты справочников
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34620128&tid=1544428]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
52ms |
get topic data: |
6ms |
get forum data: |
6ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 330ms |

| 0 / 0 |
