|
|
|
Непротиворечивость вторичных данных
|
|||
|---|---|---|---|
|
#18+
Подскажите пожалуйста, как в СУБД можно решить такую задачу: Есть некоторые данные {X} (сложные, в нескольких таблицах), на основании этих данных проводятся вычисления, результат которых {Y} записывается в БД. Вычисления могут проводиться в разное время и дополнять множество {Y}. Через некоторое время значения {X} изменяются пользователем. Как определить, что {Y} уже не соответствует исходному набору данных {X}? С уважением, ABN69 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2009, 12:36 |
|
||
|
Непротиворечивость вторичных данных
|
|||
|---|---|---|---|
|
#18+
ABN69, можно 1) организовать все вычисления с помощью триггеров так, чтобы результаты пересчитывались при изменении первичных данных 2) оформить рассчеты в виде View/вычисляемых полей И то и другое решает проблему автоматически. Если по каким-то причинам ( например, рассчет слишком тяжелый ), тогда, наверное, только запускать заново/перезаполнять. Может, спецы по DWH что-то еще подскажут... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2009, 13:01 |
|
||
|
Непротиворечивость вторичных данных
|
|||
|---|---|---|---|
|
#18+
Michael_N, спасибо за быстрый ответ, Расчеты тяжелые, поэтому перезапускать их каждый раз проблематично, да и не всегда нужно. С триггерами связываться тоже не очень хочется, поскольку в {X} может быть до 100 тысяч записей, есть ощущение, что тормоза будут ощутимые. А нет ли других механизмов? Задача, по ощущениям, трудоемкая, где искать эффективное решение (хотя бы теоретически) - непонятно. А. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2009, 13:14 |
|
||
|
Непротиворечивость вторичных данных
|
|||
|---|---|---|---|
|
#18+
А нет ли других механизмов?Т.е. пересчитать не пересчитывая ? Других нет. Либо проверяйте на лету (триггер, ХП) Либо проверяйте пакетом раз в сутки/неделю/месяц Либо оставьте как есть пока все не поломалось. Чем не вариант ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2009, 14:19 |
|
||
|
Непротиворечивость вторичных данных
|
|||
|---|---|---|---|
|
#18+
LSV, всем большое спасибо, ситуация прояснилась, вопрос снимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2009, 14:31 |
|
||
|
Непротиворечивость вторичных данных
|
|||
|---|---|---|---|
|
#18+
Может, кому то будет полезно, как может быть устроено это в вычислительных движках. Каждое вычисление состоит из стадий. Каждая стадия имеет входные данные и результаты. Для того, чтобы иметь историю, на основании каких входных данных посчитан тот или иной результат, нужно вместе (или рядом) с ним хранить эту информацию. Например, историзируем входные наборы суррогатным ключом и датой актуальности. Далее при вычислении в отдельное поле результата (или рядом, по ER-связи) сохраняется суррогатный ключ использованного входного набора. И так для каждой стадии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2009, 15:41 |
|
||
|
Непротиворечивость вторичных данных
|
|||
|---|---|---|---|
|
#18+
А6дуллаh3, спасибо, что поддержали разговор, Относительно ключей - идея хорошая, но есть ощущение, что с ними будет не очень удобно работать, т.к. в теле функции расчета придется указывать те значения, которые входят в {X}. Кроме того, при большом количестве аргументов (>10**5), время сканирования списка ключей может стать слишком большим. Более эффективным (при больших Nx) мне представляется подход, основанный на построении некоторой функции проверки НП. Поскольку алгоритм проверки в "наших руках", можно найти несколько простых признаков, по которым можно проверять сложные данные. Например, если есть длинный список элементов, то прежде чем проверять его состав, можно проверить количество элементов в списке или факты добавления-удаления элементов из списка. При N > 10**3 можно получить весьма ощутимое ускорение. В первую очередь следует проверять аргументы, частота изменения которых максимальна (больше вероятность наткнуться на условие нарушения НП), и т.п. Минусом такого подхода является необходимость множественных запросов к БД, поэтому его эффективность при небольшом объеме данных вряд ли окажется выше метода "суррогатных ключей", да и возни больше. С уважением, А. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2009, 09:55 |
|
||
|
Непротиворечивость вторичных данных
|
|||
|---|---|---|---|
|
#18+
Как вариант, вести лог изменений в исходных данных и запускать расчет либо по расписанию, либо по факту изменения исходных данных. Расчет должен запускаться джобом, чтобы сессия, запустившая его, не ждала окончания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2009, 11:09 |
|
||
|
Непротиворечивость вторичных данных
|
|||
|---|---|---|---|
|
#18+
Alexey Mugalev, На сегодня у нас примерно так и сделано. Каждый входной параметр имеет временную метку (tx), и если она окажется больше временной метки результата (ty) - значит НП нарушена. Для определения подмножества, образующего ИД задачи на текущий момент времени, формируется специальный запрос (аналог запроса, формируемого при вычислениях), сравниваются временные метки X-параметров с временной меткой результата. При обнаружении данных с tx > ty результаты расчета сбрасываются. Если юзеру они опять потребуются, он сам запускает расчет (реально, расчет может длиться сутками, прерываться и продолжаться многократно, возможен просмотр промежуточных результатов). Проверка возможных изменений, произошедших без контроля приложения, производится при загрузке объекта в память и затем контролируется "на лету". Этот вариант всех устраивал, до тех пор пока не возникла необходимость существенно усложнить структуру ИД и увеличить их объем. Теперь задумались над возможными путями оптимизации, поскольку есть опасения, что время проверки НП будет слишком большим. Устав от долгих раздумий, и отчаившись найти простое и эффективное решение, у нас возникли сомнения относительно правильности постановки задачи. М.б. и не надо контролировать НП? Если расчет проведен для состояния БД на момент времени t0, то надо просто предоставить пользователю возможность загрузить это состояние и просмотреть результаты (те самые "фотографии" состояний БД). В принципе, так сделать можно, наверное, даже интереснее первого варианта, поскольку можно посмотреть историю изменений, но мне кажется, это будет не очень удобно в работе. Обычно, при анализе результатов расчета у пользователя возникает желание что-то изменить в объекте, а у него на экране вчерашняя версия, у которой вместо колес гусеницы...:-). Да и какая польза от вчерашних результатов - только если захочется что-то приятное вспомнить...:-). Так что, поиски решения пока продолжаются, видимо, нарушать законы проектирования БД и платить за это контролем НП, все таки придется, вопрос - как? ЗЫ: Мне кажется, аналогичная ситуация возникает при генерации отчетов. Они же формируются на данный момент времени, и, ЕСНО, могут устаревать. Но вряд ли кому то придет в голову проверять актуальность отчета сравнением состояний БД - проще сгенерировать новый. В конце концов, можно сравнить результаты отчетов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2009, 19:46 |
|
||
|
Непротиворечивость вторичных данных
|
|||
|---|---|---|---|
|
#18+
Меня запутал первый пост. Если задача обратная - т.е. актуализировать расчет при изменении во входных данных - то читайте про CDC. Для разных СУБД существует по несколько технологий, позволяющих отслеживать изменения и реагировать на них. Это проработано вплоть до наличия на рынке тиражного ПО. Например, в Oracle Data Integrator многое в исходниках. Смотреть JKM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2009, 20:16 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36083861&tid=1543159]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 358ms |

| 0 / 0 |
