powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
21 сообщений из 21, страница 1 из 1
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33607724
Уважаемые практики!

Поделитесь, пожалуйста, рекомендациями по вопросу как спроектировать ХД, чтобы учесть изменения в фактах и измерениях?

Для простоты возьмём лишь следующие сущности:
-- измерения (первые три – это parent-child)
1. компании (key_company, companyName, …)
2. договора (key_treaty, key_company, treatyNumber, acceptDate, status, ….)
3. условия договора (позиции) (key_position, key_treaty, currency, startDate, endDate, positionType,…)
4. отчётные периоды (key_date, date,…)


-- факты
начисления (key_position, key_date, premium, premiumRub,…)

Многоточие означает, что в таблице есть другие атрибуты и меры.



Начнём с измерений:
(1). Компании могут:
- просто изменять своё название
- закрываться (переставать существовать)
- две объединяться в одну (по каким-то причинам в OLTP-системе введены дважды или
действительно юридически объединяться)
В OLTP-системе ведётся учёт того, когда, что произошло с компанией – есть подчинённая таблица в которой (key_company, oldCompanyName-прежнее наимнование, dateChange дата актуальности по, cause - причина)
(3). В условиях договора могут изменяться валюта (currency) и/или период действия позиции (startDate, endDate)


Сводные (агрегированные) данные о начислениях попадают в бухгалтерский баланс. В связи с этим есть понятие закрытие периода. В OLTP-системе если необходимо изменить валюту начисленной премии, период действия позиции или собственно сумму премии, то ВСЕ изменения осуществляются в следующем за закрытым отчётном периоде, при этом в следующем отчётном периоде вводится разница между тем что было и как должно быть.

При анализе, при формировании отчётности необходимо получать такую картину, которая была по состоянию на тот момент. Так,
-- по состоянию на 01.01.2005 компания «Альфа» именовалась «Альфа» и по ней начислено премии 10К USD (30 000руб)
-- по состоянию на 01.04.2005 она стала именоваться «Бета» и премии по ней начислено 10К EUR (35 000руб)
-- по состоянию на 01.07.2005 премии начислено 5К EUR (17 000руб) (поскольку было сторнирование начисления)

Как должны выглядеть хранилище данных – добавлены ли доп. таблицы или добавлены поля?
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33607748
Виктор Сакович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На первый взгляд - типичные SCD, соответственно - стандартные методы решения.
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33607840
To Виктор Сакович:

а где про эти решения можно почитать? Вчера весь вечер сидел форум листал...
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33607955
LJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читайте Дедушку Кимбела
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33607968
EugenT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DHW-вопросикTo Виктор Сакович:

а где про эти решения можно почитать? Вчера весь вечер сидел форум листал...

Почитайте форум, например: это
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33608052
То LJack:

Про Кмбела слышал, но лично не знаком, где его труды вязть почитать?
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33608078
LJack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишите на email, вышлю
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33608095
EugenT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DHW-вопросика где про эти решения можно почитать? Вчера весь вечер сидел форум листал...

Вот про SCD
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33608397
To EugenT:

статья хорошая, но где картинки??????????? они так важны для понимания, поскольку не догоняю пока что - а где и как должна записываться дата (по второму методу SCD)? какие образом измерение времени привязывается к Sales_Person_Dimension или к таблице фактов?
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33608661
EugenT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DHW-вопросикстатья хорошая, но где картинки??????????? они так важны для понимания, поскольку не догоняю пока что - а где и как должна записываться дата (по второму методу SCD)? какие образом измерение времени привязывается к Sales_Person_Dimension или к таблице фактов?

Насчет картинок - это к админам данного сайта, может они у них где-то есть. А вообще из описаний рисунков можно самому все нарисовать для понимания - тогда все станет более ясно.
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33608859
Виктор СаковичНа первый взгляд - типичные SCD, соответственно - стандартные методы решения.
Ну-ну.
Отслеживание изменения структуры иерархии стандартными методами SCD не решаются.
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33610317
Dmitry Biryukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть как минимум 2 способа
1. для каждого изменения делате запись с полями от и до. и для одной признак "активная/последняя версия". Для кубов будете делать вьюхи с джойном типа "дата факта" между "от" и "до"
2. делайте все схемы звёздами. т.е. во все таблицы фактов добавьте поля всех связанных таблиц. т.е. в кубе будет ровно одна таблица, в которой значения полей представляют собой значения связанных таблиц на момент факта

выбор метода в основном зависит от объёмов имеющихся у вас данных.
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33610320
Dmitry Biryukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Прохоров Виктор СаковичНа первый взгляд - типичные SCD, соответственно - стандартные методы решения.
Ну-ну.
Отслеживание изменения структуры иерархии стандартными методами SCD не решаются.дело в задаче. если задача стоит "отслеживать изменения структуры иерархии", тогда вы правы.
а если надо получать многомерную отчётность в условиях измененяющихся измерений, то SCD - самое оно.
только в каждом конкретном случае надо выбрать правильный тип SCD и его реализацию
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33611018
Peter Kirillow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
более правильная ссылка на статью Людке с картинками - http://www2.osp.ru/win2000/sql/2000/03/310.htm
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33612122
To Peter Kirillow:

спасибо за уточнение ссылки





То Dmitry Biryukov:

Да, мне потребуется проводить анализ фактов начислений на некоем достаточно большом интервале времени, в течение которого компании могли объединиться, удаляться, добавляться
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33613292
DHW-вопросик- две объединяться в одну (по каким-то причинам в OLTP-системе введены дважды или
действительно юридически объединяться)
1) Как при этом отражается история до объединения компаний - как история одной объединившейся или двух исходных?
2) При объединении котракты с предшественниками продолжают действовать?
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33613574
To Андрей Прохоров:

1.
На этот вопрос могу ответить так: надо и так и так, в зависимости от того, на какой вопрос необходимо дать ответ. Т.е. в некоторой ситуации необходимо показать цифры и сальдо отдельно для компании А и отдельно для компании Б, а в другой ситуации - для компании А, которая поглотила компанию Б (т.е. все цифры от компании Б присовокупить к компании А, как-будто компании Б и вовсе не было)

2.
При объединении компаний нам присылают официальную бамагу, в которой рассказывается что такая-то компания (главная) является правопреемницей по обязательствам поглощённой.
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33617793
Parkhomets Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DHW-вопросикУважаемые практики!

Поделитесь, пожалуйста, рекомендациями по вопросу как спроектировать ХД, чтобы учесть изменения в фактах и измерениях?

Для простоты возьмём лишь следующие сущности:
-- измерения (первые три – это parent-child)
1. компании (key_company, companyName, …)
2. договора (key_treaty, key_company, treatyNumber, acceptDate, status, ….)
3. условия договора (позиции) (key_position, key_treaty, currency, startDate, endDate, positionType,…)
4. отчётные периоды (key_date, date,…)


-- факты
начисления (key_position, key_date, premium, premiumRub,…)

Многоточие означает, что в таблице есть другие атрибуты и меры.



Начнём с измерений:
(1). Компании могут:
- просто изменять своё название
- закрываться (переставать существовать)
- две объединяться в одну (по каким-то причинам в OLTP-системе введены дважды или
действительно юридически объединяться)
В OLTP-системе ведётся учёт того, когда, что произошло с компанией – есть подчинённая таблица в которой (key_company, oldCompanyName-прежнее наимнование, dateChange дата актуальности по, cause - причина)
(3). В условиях договора могут изменяться валюта (currency) и/или период действия позиции (startDate, endDate)


Сводные (агрегированные) данные о начислениях попадают в бухгалтерский баланс. В связи с этим есть понятие закрытие периода. В OLTP-системе если необходимо изменить валюту начисленной премии, период действия позиции или собственно сумму премии, то ВСЕ изменения осуществляются в следующем за закрытым отчётном периоде, при этом в следующем отчётном периоде вводится разница между тем что было и как должно быть.

При анализе, при формировании отчётности необходимо получать такую картину, которая была по состоянию на тот момент. Так,
-- по состоянию на 01.01.2005 компания «Альфа» именовалась «Альфа» и по ней начислено премии 10К USD (30 000руб)
-- по состоянию на 01.04.2005 она стала именоваться «Бета» и премии по ней начислено 10К EUR (35 000руб)
-- по состоянию на 01.07.2005 премии начислено 5К EUR (17 000руб) (поскольку было сторнирование начисления)

Как должны выглядеть хранилище данных – добавлены ли доп. таблицы или добавлены поля?

1. Для реализации хранилища Вам не надо так переживать за OLTP.
2. Главное реализация основных объектов в DWH:
а.Механизм измерний
б. Механизм фактов
3. Чётко сформулирывать требования о том что может произойти с измереним, его иерархией. Чем они будут проще в ОЛТП, тем Вам будет легче.

4. Выделив все типы измерений, которые Вы планируете реализовать, приготовится к их реализации. Вероятнее всего у Вас будет SCD Type 2 - как основа ( что означает следующее: при изменении каких либо реквизитов измерения - вы это отразите в введённых Вами полях DATE_BEGIN & DATE_END и конечноже новго SID, что послужит Вам как пометкой на диаграмме Ганта в изменяющихся свойствах измерения).

Из этой основы в последсвии будет не сложно выделить "младшего брата" вашего измерения, которое будет содержать лишь информации о состоянии измерения "на сейчас" - для оператвных отчётов.

Используя SCD 2 вы будете иметь возможность охарактеризовать элемент измерения, на любой момент времени.

5. На счёт иерархии - наверно самое сложное. Если она у Вас сбаланисрована, то вы её можете привести от "parent-child" к отношению таблиц 3NF. и хорошо, когда у Вас изменятся\мигрирует только нижний уровень - задача сводится от обслуживания иерархии к свойствам SID ( сурогатного идентификатора элемента измерения ).

Если рассматривать случай изменения всех уровней иерархии, то ВЫ столкнётесь высоким уровнем роста кл-ва SID в измерении.
( представлете : Москва вдруг числится не в России, а Беларуссии - а значит надо перегистрирывать всех москвичей, с новой пропиской :)

Если Ваш "parent-child" доходит до таких требований и в один день может моменятся полностью, то вам лучше рассмотреть вариант "версий" измерения. Т.е. при изменении чего, либо у вас появлятся новая "инкарнация" измерения - действующая в определённое время.
Или же Вы можете подключить оба сразу измерения, но в Вашей снежинке - это будет выглядеть как разные имерения. ( Не злоупотребляйте ! :)


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

Не соглашайтесь в поставленном ТЗ на возможность изменения элемента измерения ( элемента его иерархии) задним числом - это усложняет реализацию.


P.S. когда вы на практике реализуете Ваши измерения, то факты - для Вас будут как семечьки.

P.P.S. Постарайтесь переубедить Ваших заказчиков не идти этим путём, а вместо первички хранить отчёты.
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33620461
Прочитав статьи Кибалла, понял так что SCD реализуется так:

Таблица ИЗМЕРЕНИЯ 1:

dimKey1 - искусственный (сурогатный) первичный ключ записи,
[identity bigint (1,1) ]
id - идентификатор записи в источнике данных (в учётной системе) - ввиду
наличия изменений уже перестаёт быть уникальным
..... - содержательные, описательные поля измерения
beginDate - дата начала актуальности действия записи, [DateTime NOT NULL]
(причём тут
нас интересуют в большинстве случаев только дата-
составляющая, если не стоит задача отслеживания изменений в
течении суток)
endDate - дата окончания актуальности действия записи, [DateTime NULL]
(для действующей на текущий момент записи - это NULL)
isActual - флаг актуальности записи (1=для действующей на текущий момент
записи, 0=для предыдущих версий записи)
checksum - контрольная сумма для записи - некое поле для служебной цели, а
именно при обновлении таблицы измерения чтобы можно было
быстро выяснить - изменилась ли запись в учётной системе (это
может быть контрольная сумма или значение timeStamp)





Таблица ИЗМЕРЕНИЯ ВРЕМЕНИ:

dimDateKey - искусственный (сурогатный) первичный ключ записи измерения
времени (календарь), [identity bigint (1,1) ]
date_ - дата [DateTime]
year_ - год даты
month - месяц года
weekNumber - номер недели в году
..... - и другие поля








Таблица ФАКТОВ:

factKey - искусственный (сурогатный) первичный ключ записи фактов,
[identity bigint (1,1) ]
dimKey1 - внешний ключ записи на измерение 1
dimKey2 - внешний ключ записи на измерение 2
....
dimDateKey - внешний ключ записи на измерение времени
..... - числовые показатели (факты)






==============================================
to Parkhomets Andrey:

по поводу п.5 хотелось бы уточнить - как будут физически выглядеть
-- вариант "версий" измерения
-- новая "инкарнация" измерения - действующая в определённое время
-- динамический модуль для крупного и несбалансированного древовидного
изменрения



В учётной системе мы вроде договорились, что если необходимо исправить (сторнировать) данные по начислениям за тот период, что уже прошёл по бухгалтерской отчётности, то те записи закрыты для изменений, а в открытом периоде вводятся записи - ДЕЛЬТА цифр, с признаком что это сторнировочная запись, относящаяся к такому-то закрытому периоду


Счас мы так и храним - каждый внутрикопоративный (управленческий) отчёт на такую-то дату - это снимок данных и расчёты от них по состоянию на ту дату.
И всё же если данные были неправильны в то время, а обнаруживается это позже, то получается что нам надо их пересчитать.
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33621987
Похоже, что придется использовать отношение многие ко многим для контрактов и компаний, т. к. после объединения контракт фактически будет относится к двум компаниям. Можно ввести фиктивный атрибут - контракт-компании. К нему превязывайте факты. Получится две цепочки компания->контракт-компании->факт и контракт->контракт-компании->факт. Это позволит отслеживать историю по контрактам и по компаниям.
...
Рейтинг: 0 / 0
Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
    #33628972
Parkhomets Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DHW-вопросикПрочитав статьи Кибалла, понял так что SCD реализуется так:
......


Задача Кимбала - раскомплексовать ваше воображение, берите от него лучшее и придумывайте свои особенности

DHW-вопросик
==============================================
to Parkhomets Andrey:

по поводу п.5 хотелось бы уточнить - как будут физически выглядеть
-- вариант "версий" измерения
-- новая "инкарнация" измерения - действующая в определённое время
-- динамический модуль для крупного и несбалансированного древовидного
измерения


-- вариант "версий" измерения и инкарнаций - это, наверно, мой личный жаргон.
Имеется в виду что вы в ROLAP схеме куба можете сделать дополнительное измерение - а то и больше, которое будет отражать одну сущность в разное время. Но я бы не пошёл таким путём, это того не стоит. Прощё перейти на витрины данных : ( например в 2006 году у вас измерение "сотрудники" было одного состава, а в 2007 абсолютного другого. Отсюда можно сделать два куба. Даже если содержание кубов перекрывается и будет избыток данных на магнитных носителях- так проще.) Если рассматривать промышленные решения то в SAP BW реализованно так, что вы можете в отчёте выбрать то состояние имерархии - которое Вам более необходимо. ЗА счёт того, что в SAP BW измерение и его иерархия отделены друг от друга через связующую таблицу, на которой может висеть сколь угодно иерархий. Все эти подходы упираются в функционал клиентского приложения.

-- на счёт последнего: идея в то, чтобы приводить self-jouin (parent-chield) измерение в правильный вид. Я говрю про ROLAP. В такой вид, в которм у Вас каждая колонка отражает уровень ииерархии - именно такой вид требуется для Oracle Discoverer. Несбалансированность решается путём "дублирования" - заполнения верхних уровней такими же как и нижние.
Имея исходное измерение - вы отслеживаите момент изменения кл-ва уровней, и пересчитываете его в вашу целевую таблицу, как правило при этом ломаются отчёты.


Если отказатся от построения большей отчётности в ROLAP то хранилище лучше заточить не под клиентсое приложение, а под способность хранить всю нужную Вам информаци, и быстрое её получение. Это наверно самый главный вывод, к которому я пришёл, после попытки реализовать хранилище, под Discovrer.

Данные нуждающиеся во вращении переливайте в MOLAP ( например от Microsoft-а, а хватит ума то и в Oracle зальёш).
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Каким образом лучше сделать учёт изменений (измерения, факты) в хранилище данных?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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