Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / OLAP и DWH Новый топик    Ответить
 Как отобразить в DWH status.  [new]
aleksrov
Member

Откуда:
Сообщений: 898
Всем привет!
Такой вопрос, есть DWH на стадии "черновика", и встал вопрос как хранить и в каком виде status и потом его обновлять, т.е. в факте или отдельном измерении.
К примеру есть заказ, он может быть в статусе создан, принят, в работе и т.д., также есть три поля времени: когда создан, когда обновлен, когда завершен. За день заказ проходит все периоды, т.е. через 24 часа он будет завершен.
Тут есть несколько мыслей:
1 сделать Accumulating Snapshot Fact Tables
2 засунуть все это в отдельное измерение (т.е. измерение Order, где все эти поля + дополнительные) и обновлять во время загрузки. Здесь вопрос в производительности, dimension будет оч. большая.
3 Также поступало предложение просто не грузить последний день, т.к. 100% завтра все заказы будут в одном статусе, а в факте просто держать когда создано и закрыто.
Может еще что есть интересное.

Заранее всем спасибо.
2 июл 18, 18:23    [21537491]     Ответить | Цитировать Сообщить модератору
 Re: Как отобразить в DWH status.  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 30485
Блог
aleksrov,

Зависит от ваших целей - одно дело анализ продаж в общем, другое - анализ конвейера заказов, то есть их статусов в каждый момент времени или анализ того, в каком статусе заказы висят дольше всего.
2 июл 18, 19:05    [21537564]     Ответить | Цитировать Сообщить модератору
 Re: Как отобразить в DWH status.  [new]
aleksrov
Member

Откуда:
Сообщений: 898
Критик,

Анализ в общем.
Когда мы делаем загрузку из источника разумеется заказы могут быть в самом разном статусе, которые не завершены не интересны для отчетности, но необходимо сохранить когда создано и закрыто, для отчета необходимо время от поступления до закрытия, другие шаги пока не интересны.
Если сделать измерение orders, а атрибуты статус, дата закрытия (дата поступления разумеется не меняется) типа scd1, + другие атрибуты заказа, типа код причины отказа (к примеру по определенным причинам он может быть отказан и если будет создан новый, то это уже другой заказ) здесь вопрос в производительности. Да и вообще такой паттерн это не очень хорошо (https://www.kimballgroup.com/2007/10/design-tip-95-patterns-to-avoid-when-modeling-headerline-item-transactions/), делать update на факте тоже не очень правильно, получается только вставляем новые строки, тогда здесь вопрос как определить строки у которых поменялся статус с последней загрузки.
Т.е. по итогу в факте нам интересна сумма заказа, это то что интересует бизнес, дальше им интересно разница между дата поступления и закрытия, также их интересует заказы (точнее сумма и причина) в статусе отказано.
Остальные измерения типа date, customer, manager и т.д. прочие и проблем не вызывают, вопрос как реализовать именно это.
2 июл 18, 19:56    [21537661]     Ответить | Цитировать Сообщить модератору
 Re: Как отобразить в DWH status.  [new]
Sutasu
Member

Откуда: Москва
Сообщений: 110
Я бы сказал, что переход из состояния в состояние - это факт. Т.е. напрашивается еще одна таблица фактов, id заказа, id времени, id статуса. Плюс потроха по вкусу, типа id оператора...
2 июл 18, 23:18    [21538071]     Ответить | Цитировать Сообщить модератору
 Re: Как отобразить в DWH status.  [new]
aleksrov
Member

Откуда:
Сообщений: 898
Sutasu,

Ну не знаю... Мне кажется есть более красивый выход. Факт это все таки поступление заказа, если делать как вы пишите все ровно придется проверять статус в источнике и в факте, т.е. это что-то типа slowly change fact 1, в инете есть конечно подобные реализации, но я не представляю как это будет работать на большой таблице, а она будет большая. В источнике только текущее состояние и когда до него обновилось (как я писал 3 столбца, дата поступления, изменения и закрытия, у закрытого соответсвенно 2 последние равны).
2 июл 18, 23:48    [21538119]     Ответить | Цитировать Сообщить модератору
 Re: Как отобразить в DWH status.  [new]
Sutasu
Member

Откуда: Москва
Сообщений: 110
Главный вопрос, на самом деле - нужна вам история изменения статуса, или нет. Если нужна - тогда по-любому ее надо где-то хранить. Если нет, тогда в основной таблице можно ограничится полем. Если хранить историю, можно завести у последнего статуса булевый флаг, что он последний, и сделать по нему индекс. Будет легче проверять...
3 июл 18, 01:41    [21538216]     Ответить | Цитировать Сообщить модератору
 Re: Как отобразить в DWH status.  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 1884
aleksrov,

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

имхо, лучше грузить последний день , просто для него ставить статус "обработка/еще не определенно"
3 июл 18, 10:53    [21538603]     Ответить | Цитировать Сообщить модератору
 Re: Как отобразить в DWH status.  [new]
aleksrov
Member

Откуда:
Сообщений: 898
Sutasu,

Нет, история не нужна, для анализа нужны заказы только в конечном статусе (отказано, закрыто), вопрос в том что при загрузке через ETL мы выгребаем все заказы во всех статусах, соответственно при следующей загрузке нам нужно обновить все заказы которые в хранилище находятся не в конечном статусе (также у них будет пустая дата закрытия), в этом и есть вопрос, как сделать это эффективно.
Также рассматривали в факте поместить, заказ, дата создания, изменения, закрытия, статус (отказано, выполнено будет 1, 0) и id_статуса (к примеру может быть 10, 20,30 это все отказано, но по разным причинам, если выполнено то просто 0), а на источник повесить CDC, но вопрос в производительности как загрузки так и источника, который OLTP система.
3 июл 18, 10:57    [21538610]     Ответить | Цитировать Сообщить модератору
 Re: Как отобразить в DWH status.  [new]
aleksrov
Member

Откуда:
Сообщений: 898
StarikNavy,

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

По поводу "лучше грузить последний день , просто для него ставить статус "обработка/еще не определенно"" немного не понял, поясните пожалуйста.
3 июл 18, 11:01    [21538620]     Ответить | Цитировать Сообщить модератору
 Re: Как отобразить в DWH status.  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3466
1. факты не обновляй - это тупик
2. сделай отдельное измерение чисто под статусы (главное не мешать с другими свойствами - если потом оно будет не нужно и сильно тормозить- легко выкинуть)
3. тип ему сделай scd3, т.к. количество статусов явно константно и невелико
3 июл 18, 11:42    [21538755]     Ответить | Цитировать Сообщить модератору
 Re: Как отобразить в DWH status.  [new]
aleksrov
Member

Откуда:
Сообщений: 898
Ivan Durak,

С SCD3 в принципе идея, вопрос что тогда делать с датой закрытия не обновляя факт, при загрузке она будет null в источнике, и только после закрытия там будет значение.
3 июл 18, 18:26    [21540248]     Ответить | Цитировать Сообщить модератору
 Re: Как отобразить в DWH status.  [new]
aleksrov
Member

Откуда:
Сообщений: 898
aleksrov,

Пока у меня только одна идея, это упростит архитектуру DWH но усложнит ETL, это просто не грузить не законченные заказы. Т.е. во время выгрузки в staging будет забираться все, а из staging забираться только законченные, при сл. загрузке из staging удалять только строки которые попали в хранилище, т.е. завершенные заказы, у не завершенных проверяем статус, если он завершился, то грузим, если нет, то до сл. загрузки.
3 июл 18, 22:22    [21540646]     Ответить | Цитировать Сообщить модератору
 Re: Как отобразить в DWH status.  [new]
kaldorey
Member

Откуда:
Сообщений: 567
aleksrov,

Здесь больше вопросов в изменяемых атрибутах заказа - меняется ли сумма, исполнители, уточняется или исправляется спецификация.
Также интересно, могут ли меняться атрибуты заказа после его окончательного статуса задним числом.
Вариантов много, например можно сделать подобие scd4 - помещать в 1 таблицу заказы в процессе, она будет значительно меньше, и в другую законченные заказы перемещать в другую таблицу, а для пользователей вьюху сверху, чтобы все могли смотреть из 1 места. Если исхитриться с landing табличками, то в основных таблицах можно обойтись вообще insert и exchange partition (в случае oracle)

А если насчет каждого поля непонятно что делать, понадобится или нет историчность по нему, а бизнес переменчив в хотелках, то есть anchor.
4 июл 18, 15:49    [21543072]     Ответить | Цитировать Сообщить модератору
 Re: Как отобразить в DWH status.  [new]
aleksrov
Member

Откуда:
Сообщений: 898
kaldorey,

Атрибуты не меняются, задним числом тоже не выйдет, timestap автоматом ставится.
Тут кстати про флаг говорили, подумал, в принципе тоже вариант. У нас есть поле last update, по нему и делать incremental загрузку.
У незавершенных заказов ставить флаг не завершен, при сл. загрузке, этот же заказ опять загрузиться, но уже завершенным, чтобы свести кол-во таких заказов к минимуму грузить только вчерашний день (бизнес это устраивает, к тому же если грузить сегодняшний там половина будет незавершенных). В таком случае PK сделать суррогатный ключ (не ID заказа).
Хранилище на MS SQL.
С Anchor не знаком, пошел учить :)
4 июл 18, 20:21    [21544107]     Ответить | Цитировать Сообщить модератору
Все форумы / OLAP и DWH Ответить