Рефераты - Афоризмы - Словари
Русские, белорусские и английские сочинения
Русские и белорусские изложения

Информационная система управления

Работа из раздела: «Программирование, компьютеры и кибернетика»

Оглавление

Введение

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

Информационная система (ИС) - любая организованная система для сбора, организации, хранения и передачи информации.

Информационная система включает в себя следующие компоненты:

- Оборудование. Данный термин относится к технике и включает в себя, непосредственно, компьютер и периферию - устройства ввода и вывода, устройства хранения данных и средства связи.

- Программное обеспечение. Сюда включаются все программы для работы с данными и руководства к ним.

- Данные. Данными являются факты, используемые программами для получения полезной информации.

- Процедуры. Нотации, которые регулируют работу компьютерной системы.

- Люди. Любая ИС приносит пользу, когда ей управляет опытный работник [1].

Классификация информационных систем, изображенная на рис. 1, представлена в виде пирамиды, которая отображает иерархию организации. Как правило, системы обработки транзакций (Transaction Processing Systems) расположены в нижней части пирамиды. Затем идут системы управления (Management Information Systems) и системы по поддержке принятия решений (Decision Support System). На верхушке пирамиды расположены информационные системы для руководящего персонала (Executive Information Systems - EIS) [2].

Рис. 1. Классификация ИС

В данной работе рассмотрена информационная система управления, ориентированная на учет заказанного и закупленного товара, работу с историческими данными компании и анализ данных для принятия стратегически верных решений. Основными компонентами данной системы являются:

- Источники данных;

- ETL-модуль;

- Хранилище данных;

- Приложение для анализа данных;

- Отчетность.

Структура системы изображена на рис. 2 [3].

Рис. 2. Схема общей структуры ИС управления

В любой информационной системе основным объектом для работы являются данные, соответственно, хранилище данных (ХД) - фундаментальный компонент системы. Поэтому в данной работе особое место выделено рассмотрению основных методологий проектирования хранилищ.

На первый план выдвинуты такие характеристики ХД, как поддержка темпоральности [4] (зависимость данных от времени) и способность к расширяемости. Во-первых, отслеживание изменений в данных влияет на точность анализируемой информации. Во-вторых, в данной работе ИС разрабатывается для применения в онлайн-магазине, а изменения в интернет-коммерции могут происходить достаточно часто, и структуру хранения данных необходимо постоянно модернизировать.

В работе рассмотрены два классических подхода к построению ХД: 3NF Билла Инмона и Star Scheme Ральфа Кимбалла, а также гибридная методология Data Vault, разработанная Дэном Линдстедом и обладающая лучшими свойствами первых двух подходов, которая наиболее подходит для достижения поставленных целей.

Основными целями работы являются:

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

- Предоставление аналитикам компании удобного, простого в использовании инструмента для визуализации информации в целях оптимизации бизнес-процессов.

Результатом данной работы будет являться информационная система, служащая для управления запасами и закупками интернет-магазина и использующая в своей основе темпоральное хранилище данных. Для достижения желаемого результата необходимо выполнить следующие задачи:

- Построить модель источника данных, спроектировать и создать OLTP базу данных.

- Спроектировать и реализовать хранилище данных на основе выбранной методологии.

- Выполнить загрузку данных из источника, используя ETL-приложение.

- Построить слой метаданных, с которым будет работать конечный пользователь

- Визуализировать данные для анализа путем создания бизнес-отчетов.

1. Анализ существующих решений

1.1 Хранилище данных в 3NF Билла Инмона

Инмон делит всю среду баз данных организации на четыре уровня:

- Оперативный уровень;

- Хранилище с атомарными данными;

- Ведомственный уровень;

- Индивидуальный уровень.

Последние три уровня включают в себя непосредственно хранилище данных. Первый уровень содержит данные из систем обработки транзакций и предназначен для поддержки ежедневного функционирования организации. Данные из оперативных систем приводятся к единообразию и затем загружаются в хранилище с атомарными данными. Данные, хранящиеся на ведомственном уровне, могут быть слабо или сильно агрегированы, в зависимости от требований к информации, заданных определенным отделом. Архитектура Инмона гарантирует согласованность данных, т.к. все ведомственные данные поступают из атомарного хранилища. Отдельные пользователи создают четвертый и конечный уровень архитектуры среды, когда создают ad-hoc наборы данных в рамках анализа поддержки принятия решений. Четвертый уровень, как правило, носит временный характер и и размещается на персональных компьютерах пользователей.

Инмон определяет хранилище данных в качестве централизованного репозитория для всего предприятия. ХД, построенное по принципу третьей нормально формы, хранит «атомарные» данные на самом низком уровне детализации. Витрины данных измерений создаются только после полной реализации хранилища. Таким образом, ХД находится в центре Корпоративной Информационной Фабрики, которая обеспечивает логическую основу для предоставления бизнес-аналитики.

Следующие термины используются в архитектуре ХД по Инмону:

- Предметная ориентированность: данные в хранилище организованы таким образом, что все измерения, относящиеся к событиям или объектам реального мира, связаны друг с другом.

- Отслеживание информации: изменения данных в ХД отслеживаются и записываются так, чтобы формируемые отчеты могли их фиксировать.

- Энергонезависимость: данные в хранилище не могут быть перезаписаны или удалены - однажды записанная, информация становится статической и доступной только для чтения.

- Интегрированность: хранилище содержит данные из большинства или всех операционных приложений организации, эти данные консолидированы и приведены в соответствие друг с другом [6].

Архитектура 3NF Инмона представлена на рис. 3.

Рис. 3. 3NF Билла Инмона

Достоинства подхода:

- Целостность данных в витринах данных;

- Единое хранилище данных на физическом уровне;

- Быстрота создания хранилища при помощи итерационного метода;

- Высокая степень детализации данных;

- Централизованное управление деятельностью организации.

Недостатки подхода:

- Отсутствие прямого доступа в ХД;

- Сложность в использовании системы обычными пользователями;

- Затраты больших объемов ресурсов на создание и поддержание системы [7].

1.2 Star Schema Ральфа Кимбалла

В отличие от методологии Билла Инмона, Ральф Кимбалл рекомендует строить хранилище данных, следуя подходу «снизу-вверх» [8]. Хранилище по Кимбаллу начинается с построения витрин данных. Каждая витрина содержит данные как на атомарном, так и на агрегированном уровнях, предоставляя актуальную информацию. Различные витрины данных соединены через, так называемую, шину измерений, что позволяет пользователю получить доступ ко всем данным во всех витринах.

Кимбалл выделяет следующие цели для хранилища данных:

- Сделать информацию легко доступной;

- Предоставлять информацию организации в целостном виде;

- Быть адаптивным и устойчивым к изменениям;

- Защищать информацию;

- Служить основой для увеличения качества принятия решений.

Рассмотрим принцип построения ХД, предложенный Ральфом Кимбаллом, поподробнее.

Кимбалл предлагает использовать метод моделирования данных, уникальный для ХД - многомерное моделирование. Такой метод начинается с создания таблиц фактов и измерений. Таблицы фактов содержат показатели, в то время как таблицы измерений содержат атрибуты метрик из таблиц фактов. Таблицы измерений обычно содержат повторяющиеся группы, что нарушает правила нормализации. Таблицы фактов содержат много строк и относительно мало столбцов. Это необходимо для простоты использования и производительности запросов. Таблицы измерений, напротив, могут содержать сотни столбцов и занимать относительно небольшое пространство на жестком диске, т.к. все атрибуты хранятся в сильно денормализованном виде.

В архитектуре Кимбалла данные копируются из источников - оперативных систем - в области подготовки данных (staging area). В такой промежуточной области данные очищаются и затем загружаются в витрины данных. Витрины являются источниками запросов конечных пользователей. Каждая витрина данных отражает конкретный бизнес-процесс. Примерами таких процессов служат продажи, инвентаризация, закупки, управление заказами и т.д.

Архитектура шины является частью подхода Кимбалла, которая позволяет интегрировать все витрины данных в единое целое - хранилище данных. Архитектура шины подразумевает наличие стандартизированных согласованных измерений. Основным требованием согласованных измерений является то, что ключи, имена столбцов определения и значения атрибутов соответствуют друг другу в разных бизнес-процессах. Применение архитектуры шины гарантирует, что показатели одного и того же измерения в разных таблицах фактов всегда будут относиться к данным об этом показателе (рис. 4).

Методология разработки хранилища по Кимбаллу включает в себя 4 шага. В качестве первого шага необходимо выбрать бизнес-процесс. Затем следует решить, какой уровень детализации данных будет содержать хранилище. Самый низкий уровень называется атомарным, а это означает, что он не может быть более разделен. Следующим шагом является выбор измерений. Это могут быть «Дата», «магазин», «продукт» и т.д. Каждая таблица измерений имеет большое количество атрибутов. Но, т.к. данные в таких таблицах хранятся в денормализованном виде, объем данных за десятилетний период, по подсчетам Кимбалла, измеряется в килобайтах. Четвертый и последний этап заключается в выборе фактов. Примерами фактов служат «цена продукта», «количество продукта», «доход» и т.д [9].

Таким образом, модель данных по Кимбаллу позволяет конечному пользователю запрашивать детализированную информацию, а также агрегировать ее. Также, модель выполнена по схеме «звезда», что позволяет увеличить скорость выполнения запросов за счет денормализации данных.

Рис. 4. Star Schema Ральфа Кимбалла

Достоинства подхода:

- Высокая производительность ввиду особенности построения хранилища;

- Прямой доступ конечных пользователей к данным в хранилище;

- Простота в использовании системы обычными пользователями;

- Виртуальные витрины данных.

Недостатки подхода:

- Неспособность системы к расширяемости;

- Отсутствие целостного хранилища данных;

- Затруднительный процесс обработки изменений в хранилище ввиду особенностей его построения [10].

1.3 Результаты анализа

Таблица 1. Сравнение двух классических методологий создания ХД

Критерий

3NF Инмона

Star Schema Кимбалла

Общий подход

«сверху-вниз»

«снизу-вверх»

Структура

Общее хранилище данных на физическом уровне

Витрины данных, моделирующие отдельные бизнес-процессы; общность достигается за счет архитектуры шины и согласованных измерений

Сложность метода

Достаточно сложный

Простой

Целевая аудитория

IT-специалисты

Пользователи

Характер требований к поддержке принятия решений

Стратегический

Тактический

Требования к интеграции данных

Интеграция всей деятельности компании

Отдельные направления деятельности

Масштабируемость

Растущие масштабы и изменяющиеся требования имеют решающее значение

Необходимость адаптироваться к высокой волатильности потребностей

в ограниченном объеме

Постоянство данных

Высокая скорость изменения в исходных системах

Системы-источники относительно стабильны

Стоимость развертывания

Высокие начальные затраты, более низкие затраты на разработку последующих проектов

Низкие начальные затраты, с каждым последующим проектом стоимость существенно не изменяется

Хранение данных

Разграничение хранения данных: атомарные данные хранятся в ХД 3NF, суммированные данные хранятся в витринах.

Суммарные и атомарные данные хранятся совместно в виртуальных витринах, построенных по модели «звезда».

Производительность

Прямые запросы к ХД 3NF занимают большое кол-во времени. Для выполнения запросов и создания отчетности необходимо наличие витрин данных

Высокая производительность благодаря прямому доступу как к атомарным, так и к суммарным данным в витрине

Отслеживание изменения данных

Наличие меток времени для отслеживания времени валидности данных, а также времени транзакций

Использование концепции медленно изменяющихся измерений, чтобы отследить исторические изменения

2. Выбранный метод решения

В качестве метода, применяемого для разработки хранилища данных, в данной работе выбрана и подробно рассмотрена ниже инновационная архитектура Data Vault.

Данная методология изначально была задумана Дэном Линстедом в 1990 и выпущена в свободном доступе в 2000 году. Правила метода Data Vault были освещены и разъяснены в серии из пяти статей на официальном сайте автора. В последующих разделах приведено описание метода с указанием его отличительных особенностей.

2.1 Общие сведения о модели Data Vault

Data Vault представляет собой метод моделирования ХД, который предназначен для обеспечения долгосрочного хранения исторических данных, поступающих из операционных систем, и решения проблем отслеживания данных, скорости загрузки и устойчивости к изменениям [11].

Данная методология имеет ряд следующих особенностей:

- Отслеживание источника данных. Каждая строка в хранилище сопровождается записью о таблице, из которой данная строка была загружена, и датой загрузки.

- Отсутствие разделения на «чистые» и «грязные» (не соответствующие бизнес-правилам) данные. Это означает, что в ХД хранится «единая версия фактов», т.е. все данные компании, в отличие от практики других методов хранения «единой версии истины», где данные, не соответствующие определениям, удаляются или «очищаются».

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

- Обеспечение параллельной загрузки.

В двух основных методологиях построения хранилищ данных, рассмотренных в первой главе, - модели Билла Инмона и модели Ральфа Кимбалла - возникают проблемы при работе с изменениями в системах-источниках. Перед загрузкой данных в хранилище в обоих методах необходима предварительная очистка, что в ряде случаев нежелательно, т.к. неизбежно ведет к потере информации. Data Vault спроектирован таким образом, чтобы избежать или свести к минимуму воздействие этих проблем путем выделения структурных элементов, таких как бизнес-ключи, от описательной информации. Очистка же в Data Vault происходит на этапе перегрузки данных из непосредственно хранилища в витрины данных.

Дэн Линстед описывает разработанный метод следующим образом:

«Data Vault - набор уникально связанных нормализованных таблиц, содержащих детальные данные, отслеживающих историю изменений и предназначенных для поддержки одной или нескольких функциональных областей бизнеса. Это - гибридный подход, обобщающий лучшие свойства третьей нормальной формы и схемы Звезда. Дизайн Data Vault - гибок, масштабируем, последователен и приспосабливаем к потребностям предприятия» [12].

Философия Data Vault заключается в том, что все данные являются релевантными, даже если они не соответствуют установленным бизнес-правилам. Несоответствие данных есть проблема бизнеса, а не хранилища данных. В Data Vault заносятся все данные со всех источников, и только при составлении отчетов и извлечении данных из хранилища они проходят очистку.

2.2 Компоненты Data Vault

В представленной методологии проблема регистрирования изменений в производственной среде компании решается путем разделения бизнес-ключей (модифицируются редко, т.к. однозначно идентифицируют бизнес-сущность) и связей между ними от описательных атрибутов этих ключей. Бизнес-ключи их связи являются структурными элементами, образующими «скелет» модели данных. Методология Data Vault в качестве одной из своих аксиом утверждает, что реальные бизнес-ключи меняются только тогда, когда происходят изменения в основном направлении бизнеса, а соответственно являются наиболее стабильными элементами, из которых можно вывести структуру исторического ХД. Используя эти ключи в качестве основы хранилища, можно организовать остальные данные вокруг них. Таблицы, хранящие в себе бизнес-ключи, называются Хабами (Hubs). Таблицы, которые представляют собой ассоциации между бизнес-ключами, называются Связями (Links). Таблицы с описательными атрибутами - Спутники (Satellites).

2.2.1 Хабы

Таблицы Хабы содержат список уникальных бизнес-ключей с минимальной склонностью к изменениям. Также в Хабах хранятся суррогатный ключ для каждого элемента Хаба, время и дата загрузки каждой строки в таблицу и метаданные, описывающие происхождение бизнес-ключа (обычно сюда записывается название таблицы из базы данных источника). После выхода в 2013 году модели Data Vault версии 2.0 суррогатные ключи во всех таблицах хранятся в виде хеш-функции на основе алгоритма MD5 с фиксированной длиной CHAR32.

Хаб содержит как минимум следующие столбцы (табл. 2):

- Суррогатный ключ. Используется для связи с другими таблицами в ХД.

- Бизнес-ключ. Основной компонент Хаба.

- Источник записи. Используется для отслеживания источника данных.

- Дата загрузки. Обеспечивает поддержку темпоральности ХД.

Таблица 2. Структура таблицы Хаб

Название столбца

Описание

HUB_***_HSK

Суррогатный ключ

HUB_***_ID

Бизнес-ключ

HUB_***_RSRC

Данные об источнике

HUB_***_LDTS

Дата загрузки записи

2.2.2 Связи

Ассоциации или транзакции между бизнес-ключами (например, отношение Хабов «Покупатель» и «Продукт» в контексте сделки купли-продажи) моделируются с помощью таблиц Связей. В основном, Связи представляют собой соединения «многие-ко-многим».

Таблицы Связи содержат (табл. 3):

- Суррогатные ключи Хабов, ассоциации которых они представляют;

- Свой собственный суррогатный ключ;

- Метаданные, описывающие происхождение ассоциации, т.е. таблицу-источник

- Дату загрузки записи в таблицу.

Таблица 3. Структура таблицы Связь

Название столбца

Описание

LNK_***_HSK

Собственный суррогатный ключ

LNK_***_RSRC

Данные об источнике

LNK_***_LDTS

Дата загрузки записи

HUB_***_HSK(1)

Суррогатный ключ Хаба, первый якорь связи

HUB_***_HSK(N)

Суррогатный ключ Хаба, N-ный якорь связи

Спутники

Хабы и Связи образуют структуру модели, но не имеют никакой описательной информации. Она хранится в отдельных таблицах, называемых Спутниками. Помимо описательных атрибутов, Спутники состоят из метаданных, связывающих их с родительским Хабом или Связью и хранящих наименование источника (табл. 4).

Спутники обеспечивают «мясо» модели данных, контекст для бизнес-процессов, которые фиксируются в Хабах и Связях.

Все таблицы содержат метаданные, описывающие, по крайней мере, дату загрузки каждой записи в ХД, что обеспечивает историческое представление данных, поступающих в хранилище. С выходом модели Data Vault 2.0 в таблицы Спутников добавилась еще одна колонка - хеш-ключ, особым образом сформированный с помощью алгоритма MD5, для определения, изменились ли данные в источнике после последней загрузки в ХД.

Таблица 4. Структура таблицы Спутник

Название столбца

Описание

HUB_***_HSK

Суррогатный ключ родительского Хаба

SAT_***_LDTS

Дата загрузки записи

SAT_***_RSRC

Данные об источнике

SAT_***_HDIFF

Хеш-ключ для отслеживания изменений в атрибутах

Product_name

Category

Атрибуты

2.3 Методология Data Vault

Данная методология содержит правила, стандарты, а также драйверы, с помощью которых осуществляется управление проектом. Она описывает модели загрузки данных, стандартные домены атрибутов, системные поля и компоненты по учету времени, необходимые для того, чтобы архитектура Data Vault отражала надлежащие потребности бизнеса. Эта методика также говорит о том, что бизнес-правила можно разделить на две составляющие: жесткие и мягкие правила.

Мягкие правила бизнеса состоят из инструкций, которые меняют содержание данных, контекст или детализацию данных. Информация, в соответствии с мягкими правилами, обрабатывается на пути из хранилища данных (в витрины данных, в отчеты).

Считается, что жесткие правила бизнеса включают в себя нормализацию, значения по умолчанию (замена NULL-значений) и согласование типов данных. Жесткие правила выполняются на пути в модель Data Vault или, иногда, на пути к области подготовки данных.

Методология вобрала в себя лучшие свойства концепций Six Sigma, TQM, SEI/CMMI Level 5 и PMP. Она максимально приближает усилия, приложенные на проектирование хранилища данных, к результатам, которые ожидаются при применении оптимизации бизнес-процессов.

Применение методики опытными сотрудниками позволяет сделать процесс построения ХД относительно простым, последовательным и измеримым по времени.

Agile-процесс по построению модели Data Vault включает в себя следующие шаги:

а) Выбрать вид отчетности для последующего его создания ~1 ч;

б) Определить исходные информационные системы, таблицы-источники ~2 ч;

в) Спроектировать ER-модель Data Vault ~1 ч;

г) Добавить атрибуты к существующей ER-модели ~5 ч;

д) Создать ETL-процедуры загрузки данных в Data Vault ~16 ч;

е) Спроектировать модель витрины данных для отчетности ~2 ч;

ж) Загрузить данные в витрины путем создания ETL-процедур или SQL-скриптов ~32 ч;

з) Построить отчеты на основе витрин данных ~16 ч;

и) Протестировать корректность данных в отчетах ~5 ч.

2.4 Архитектура Data Vault

Система Data Vault основана на трёхъярусной архитектуре. Исходное корпоративное хранилище данных отделяется от бизнес-пользователей и используемых ими слоев данных (например, схем «звезда»). Эта изоляция дополнительно снижает затраты и накладные расходы, связанные с изменениями, которые происходят на уровне бизнеса.

Тремя ярусами в данной архитектуре являются:

- Область подготовки данных (только для пакетов исходных данных);

- Корпоративное хранилище Data Vault;

- Витрины данных (рис. 5).

Рис. 5. Общий вид архитектуры Data Vault

В настоящих обрабатывающих системах реального времени ХД на основе Data Vault становится абонентом и инициатором ESB (Enterprise Service Bus, Сервисная Шина Предприятия). Сообщения в режиме реального времени не останавливаются в области подготовки данных, а направляются в ХД напрямую.

Путем разделения представительского слоя от слоя хранения всех корпоративных данных можно достичь согласованности в наборах результатов, а также внедрить, так называемый, self-service BI. Такое «разъединение» слоев дает возможность построить виртуальный слой витрин данных поверх ХД. Бизнес-пользователи получают право напрямую управлять этим виртуальным слоем и изменять его. Отсюда и термин: self-service BI.

Архитектура модели играет ключевую роль в разделении обязанностей, позволяя каждому компоненту быть масштабируемым надлежащим образом для того, чтобы удовлетворять постоянно меняющиеся потребности бизнеса. Обычно, говоря о масштабе, на ум приходят термины BIG DATA и NoSQL. За счет внедрения стандартов и спецификаций Data Vault 2.0 можно легко согласовать неструктурированные и полуструктурированные данные непосредственно в ХД.

2.5 Принципы загрузки данных

ETL-процесс для хранилища данных модели Data Vault достаточно прост. Во-первых, необходимо загрузить все Хабы, создав при этом суррогатные идентификаторы для каждого нового бизнес-ключа. Во-вторых, необходимо осуществить генерацию суррогатных ключей для таблиц Связей и загрузить в них ранее созданные ключи Хабов вместе с остальными метаданными. Затем нужно создать ETL-процессы для Спутников. Созданые суррогатные ключи Связей и Хабов необходимо загрузить в Спутники в виде внешних ключей.

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

Разработка ETL для Data Vault ввиду несложной реализации позволяет создавать шаблоны и автоматизировать процесс. Сложности могут возникнуть только в случае, если таблицы Связи соединены друг с другом, а избежать данных ситуаций можно путем реорганизации модели, что является рекомендуемым решением.

Данные никогда не удаляются из хранилища Data Vault, за исключением случая, когда возникают технические ошибки во время загрузки данных [13].

2.6 Преимущества

В качестве подведения итогов рассмотрения модели Data Vault, выбранной в данной работе для построения хранилища данных в ИС, выделим ее основные преимущества перед аналогами.

- Адаптивность к меняющимся бизнес-требованиям. Отделяя бизнес-ключи и их связи от описательных атрибутов, Data Vault поддерживает весьма адаптируемую структуру, сохраняя при этом высокую степень целостности данных.

- Поддержка больших объемов данных. Data Vault нотации 2.0 включает в себя полную интеграцию Big Data наряду с методологией, архитектурой и основными способами реализации. С помощью этого обновления большие данные могут быть легко включены в состав ХД.

- Простота построения корпоративного хранилища данных. Создание эффективной модели Data Vault может быть легко и быстро осуществлено с помощью трех основных типов таблиц: Хабов, Связей и Спутников. Загрузка данных также происходит быстро, т.к. может быть распараллелена ввиду особенностей модели.

- Эффективность и удобство использования бизнес-пользователями. Data Vault по сути хранит в себе онтологию предприятия, которая полностью описывает бизнес-логику, все ее отношения и изменения за время существования компании. Философия модели заключается в том, что все данные релевантны, даже если они ошибочны, поэтому Data Vault хранит всю информацию организации, но со специальными временными метками, обозначающими актуальность данных, что обеспечивает поддержку темпоральности. Для удобства пользователей ХД делится на три слоя: область подготовки данных, корпоративное хранилище (онтология предприятия) и витрины данных, содержащие только актуальную информацию, с которой и работают аналитики компании.

2.7 Возможные области применения

Благодаря своей универсальности, методология Data Vault может быть применена во многих проектах и областях бизнеса.

Примеры некоторых структурных решений, использующих в своей основе Data Vault:

- Динамическое хранилище данных - ХД на основе автоматизированных изменений структуры и процессов в реальном времени.

- In-Database Data Mining - позволяет инструментам интеллектуального анализа использовать исторические данные из хранилища.

- Быстрая связь внешней информации - способность быстро адаптировать поступившие извне данные для анализа в ХД без нарушения целостности существующего содержимого.

Многие зарубежные крупные компании с мировой известностью используют корпоративные хранилища данных, построенные на архитектуре Data Vault. Примерами таких компаний служат Logica, Microsoft, SNS Bank и другие. В России методология Data Vault малоизвестна. Тем не менее, некоторые передовые организации, такие как Tele2 и Wildberries.ru, уже внедрили ее в свои аналитические системы. В данной работе рассматривается розничный интернет-магазин. Эволюция онлайн-торговли происходит с невероятной скоростью, а значит, направление развития компании, структура и логика бизнеса могут постоянно меняться. В таком случае легко расширяемая, хранящая все исторические данные методология отлично подойдет для успешного и удобного ведения бизнеса.

3. Создание информационной системы

3.1 Обоснование выбора применяемых инструментов

При создании любой информационной системы важно со всей ответственностью подойти к вопросу хранения данных. Организация темпорального ХД подразумевает под собой оперирование большими объемами данных, требует высокой производительности и безопасности. Здесь подходящим решением является СУБД Microsoft SQL Server 2012. Данная СУБД обладает высокой степенью надежности, достигаемой за счет применения таких технологий, как зеркалирование, средства управления журналами и кластеризация. Еще одно несомненное преимущество MS SQL Server заключается в ее возможности по масштабированию и высокой производительности. Функция партиционирования позволяет разбивать большие таблицы, в результате чего данные размещаются на разных физических носителях и, таким образом, операции чтения и записи ведутся параллельно. Безопасность данных в СУБД реализована с помощью поддержки современных алгоритмов шифрования. Все данные на жестком диске хранятся в зашифрованном виде. А также, MS SQL Server имеет клиентскую программу с удобным графическим интерфейсом и классическим языком запросов Transact SQL.

В качестве ETL-модуля был выбран Talend Data Integrator. Преимущества данного продукта заключаются в том, что это бесплатное программное обеспечение, обладающее широким функционалом и поддерживающее огромное количество реляционных и NoSQL СУБД. Все процессы трансформации данных создаются с помощью простейшего drag & drop, а, т.к. исходный код продукта написан на Java, то создать дополнительные процедуры по обработке данных не составляет труда при базовых знаниях языка программирования. Также Talend обладает высокой производительностью и способен запускать трансформации параллельно.

Для визуализации данных в работе использованы два приложения модуля Business Objects от компании SAP. Во-первых, Universe Designer - приложение для создания мета-слоя, набора данных, ограниченного понятной конечному пользователю предметной областью. Во-вторых, Web Intelligence - приложение для формирования аналитических отчетов на основе вышеупомянутого мета-слоя. Продукты SAP BO имеют интуитивно понятный интерфейс, удобный сервис обслуживания, мощную систему анализа данных, позволяющую получить более глубокое понимание бизнеса.

3.2 Анализ источника данных

Как правило, источником данных для информационной системы управления служат транзакционные системы организации, excel-таблицы или плоские файлы. В данной работе в качестве основы для анализа источника была взята OLTP-база данных реального магазина «profposuda.ru», занимающегося продажей ресторанного оборудования. Все наименования товаров реальны, а остальные данные обезличены, т.к. это коммерческая тайна компании.

При анализе источника данных были выделены следующие бизнес-процессы:

- Заказы поставщикам;

- Заказы покупателей;

- Продажи.

Далее представлена инфологическая модель бизнес-процессов в нотации BPMN [14] (рис. 6).

Рис. 6. Инфологическая модель бизнес-процессов

Логическая модель источника, построенная в нотации IDEF1X, разделена по бизнес-процессам и изображена на рис. 7 и 8.

Рис. 7. Продажи и заказы покупателей

Рис. 8. Заказы поставщику

Рисунок 9 изображает физическую схему базы данных.

Рис. 9. Физическая схема БД

Ниже приведено полное описание таблиц источника (табл. 5).

Таблица 5. Описание таблиц источника данных

Название таблицы

Название колонки

Первичный ключ

Внешний ключ

Тип данных

Company

CompanyID

P

NUMERIC (18)

CompanyCode

NVARCHAR (50)

CompanyName

NVARCHAR (50)

Address

NVARCHAR (100)

Customer

CustomerID

P

NUMERIC (18)

CustomerCode

NUMERIC (18)

CustomerName

NVARCHAR (50)

Address

NVARCHAR (100)

Email

NVARCHAR (50)

CustomerOrder_Details

CustomerOrderDetailsID

P

NUMERIC (18)

CustomerOrderHeaderID

F

NUMERIC (18)

ProductID

F

NUMERIC (18)

Quantity

NUMERIC (18)

Price

REAL

Summ

REAL

CustomerOrder_Header

CustomerOrderHeaderID

P

NUMERIC (18)

CustomerOrderNumber

NUMERIC (18)

OrderDate

Date

SalesContractID

F

NUMERIC (18)

CompanyID

F

NUMERIC (18)

CustomerID

F

NUMERIC (18)

WarehouseID

F

NUMERIC (18)

ResponsibleID

F

NUMERIC (18)

Product

ProductID

P

NUMERIC (18

ProductName

NVARCHAR (255)

VendorCode

NVARCHAR (50)

ProductLineID

F

NUMERIC (18)

Producer

NVARCHAR (50)

Price

REAL

ProductCategory

ProductCategoryID

P

NUMERIC (18)

ProductCategoryName

NVARCHAR (50)

ProductLine

ProductLineID

P

NUMERIC (18)

ProductLineName

NVARCHAR (100)

ProductCategoryID

F

NUMERIC (18)

Responsible

ResponsibleID

P

NUMERIC (18)

ResponsibleCode

NVARCHAR (50)

ResponsibleName

NVARCHAR (50)

Email

NVARCHAR (50)

Telephone

NVARCHAR (20)

SalesContract

SalesContractID

P

NUMERIC (18)

ConctractNumber

NVARCHAR (50)

Date

Date

FinishDate

Date

CompanyID

F

NUMERIC (18)

Sales_Details

SalesDetailsID

P

NUMERIC (18)

SalesHeaderID

F

NUMERIC (18)

ProductID

F

NUMERIC (18)

Quantity

NUMERIC (18)

Price

REAL

Summ

REAL

Sales_Header

SalesHeaderID

P

NUMERIC (18)

SalesDocNumber

NUMERIC (18)

DocumentDate

Date

SalesContractID

F

NUMERIC (18)

CompanyID

F

NUMERIC (18)

CustomerID

F

NUMERIC (18)

WarehouseID

F

NUMERIC (18)

ResponsibleID

F

NUMERIC (18)

SupplierContract

SupplierContractID

P

NUMERIC (18)

ContractNumber

NVARCHAR (50)

Date

Date

FinishDate

Date

SupplierID

F

NUMERIC (18)

SupplierOrder_Details

SupplierOrderDetailsID

P

NUMERIC (18)

SupplierOrderHeaderID

F

NUMERIC (18)

ProductID

F

NUMERIC (18)

Quantity

NUMERIC (18)

Price

REAL

Summ

REAL

SupplierOrder_Header

SupplierOrderHeaderID

P

NUMERIC (18)

SupplierOrderNumber

NUMERIC (18)

OrderDate

Date

SupplierContractID

F

NUMERIC (18)

CompanyID

F

NUMERIC (18)

SupplierID

F

NUMERIC (18)

WarehouseID

F

NUMERIC (18)

ResponsibleID

F

NUMERIC (18)

Supplier

SupplierID

P

NUMERIC (18)

SupplierCode

NUMERIC (18)

SupplierName

NVARCHAR (50)

Address

NVARCHAR (100)

INN

NUMERIC (32)

Warehouse

WarehouseID

P

NUMERIC (18)

WarehouseCode

NVARCHAR(50)

WarehouseName

NVARCHAR (50)

WarehouseType

NVARCHAR (20)

CompanyID

F

NUMERIC (18)

3.3 Проектирование хранилища данных

В состав схемы базы данных источника включены 10 таблиц справочников:

- Company;

- Customer;

- Product;

- ProductCategory;

- ProductLine;

- Responsible;

- SalesContract;

- SupplierContract;

- Supplier;

- Warehouse.

3 заголовочных таблицы фактов:

- CustomerOrder_Header;

- Sales_Header;

- SupplierOrder_Header.

И 3 детальных таблицы фактов:

- CustomerOrder_Details;

- Sales_Details;

- SupplierOrder_Details.

При проектировании хранилища типа Data Vault необходимо создать:

а) Хабы на основе таблиц справочников и заголовков фактов, выделив из них бизнес-ключи. Принято, что Хабы на основе детальных таблиц фактов не создаются. Все их первичные и внешние ключи входят в состав таблицы Связи.

б) Связи на основе всех таблиц, в составе которых имеются внешние ключи.

в) Спутники для каждого Хаба (или в случае детальных таблиц фактов - Связи), хранящие все атрибуты бизнес-ключа.

Также важно добавить в ХД ссылочную таблицу «Календарь», содержащую такие данные, как дата, день недели, год и т.д., и необходимую для связи с временной линией на уровне бизнес-запросов. Скрипт создания и заполнения данной таблицы приведен в Приложении 1.

Далее представлена таблица, на которой отражено соответствие таблиц источника таблицам в хранилище Data Vault (табл. 6).

Таблица 6. Список таблиц хранилища в соответствии с таблицами источника

Название таблицы источника

Название таблицы в хранилище

Company

HUB_Company

SAT_Company

Customer

HUB_Customer

SAT_Customer

CustomerOrder_Details

LNK_CustomerOrder_Details

SAT_CustomerOrder_Details

CustomerOrder_Header

HUB_CustomerOrder

LNK_CustomerOrder

SAT_CustomerOrder

Product

HUB_Product

LNK_Product_PLine

SAT_Product

ProductCategory

HUB_ProductCategory

SAT_ProductCategory

ProductLine

HUB_ProductLine

LNK_PLine_PCategory

SAT_ProductLine

Responsible

HUB_Responsible

SAT_Responsible

SalesContract

HUB_SalesContract

LNK_Company_Contract

SAT_SalesContract

Sales_Details

LNK_Sales_Details

SAT_Sales_Details

Sales_Header

HUB_Sales

LNK_Sales

SAT_Sales

SupplierContract

HUB_SupplierContract

LNK_Supplier_Contract

SAT_SupplierContract

SupplierOrder_Details

LNK_SupplierOrder_Details

SAT_SupplierOrder_Details

SupplierOrder_Header

HUB_SupplierOrder

LNK_SupplierOrder

SAT_SupplierOrder

Supplier

HUB_Supplier

SAT_Supplier

Warehouse

HUB_Warehouse

LNK_Company_Warehouse

SAT_Warehouse

REF_Calendar

Табл. 7 отображает полное описание физической реализации хранилища Data Vault.

Таблица 7. Описание таблиц хранилища данных

Название таблицы

Название колонки

Первичный ключ

Внешний ключ

Тип данных

HUB_Company

HUB_Company_HSK

P

CHAR (32)

comp_ID

Integer

HUB_Company_LDTS

Datetime

HUB_Company_RSRC

NVARCHAR (50)

HUB_Customer

HUB_Customer_HSK

P

CHAR (32)

cust_ID

Integer

HUB_Customer_LDTS

Datetime

HUB_Customer_RSRC

NVARCHAR (50)

HUB_CustomerOrder

HUB_CustomerOrder_HSK

P

CHAR (32)

custOrd_ID

Integer

HUB_CustomerOrder_LDTS

Datetime

HUB_CustomerOrder_RSRC

NVARCHAR (50)

HUB_Product

HUB_Product_HSK

P

CHAR (32)

prod_ID

Integer

HUB_Product_LDTS

Datetime

HUB_Product_RSRC

NVARCHAR (50)

HUB_ProductCategory

HUB_ProductCategory_HSK

P

CHAR (32)

prodCat_ID

Integer

HUB_ProductCategory_LDTS

Datetime

HUB_ProductCategory_RSRC

NVARCHAR (50)

HUB_ProductLine

HUB_ProductLine_HSK

P

CHAR (32)

prodLine_ID

Integer

HUB_ProductLine_LDTS

Datetime

HUB_ProductLine_RSRC

NVARCHAR (50)

HUB_Responsible

HUB_Responsible_HSK

P

CHAR (32)

resp_ID

Integer

HUB_Responsible_LDTS

Datetime

HUB_Responsible_RSRC

NVARCHAR (50)

HUB_Sales

HUB_Sales_HSK

P

CHAR (32)

sales_ID

Integer

HUB_Sales_LDTS

Datetime

HUB_Sales_RSRC

NVARCHAR (50)

HUB_SalesContract

HUB_SalesContract_HSK

P

CHAR (32)

salesC_ID

Integer

HUB_SalesContract_LDTS

Datetime

HUB_SalesContract_RSRC

NVARCHAR (50)

HUB_Supplier

HUB_Supplier_HSK

P

CHAR (32)

suppl_ID

Integer

HUB_Supplier_LDTS

Datetime

HUB_Supplier_RSRC

NVARCHAR (50)

HUB_SupplierContract

HUB_SupplierContract_HSK

P

CHAR (32)

supplC_ID

Integer

HUB_SupplierContract_LDTS

Datetime

HUB_SupplierContract_RSRC

NVARCHAR (50)

HUB_SupplierOrder

HUB_SupplierOrder_HSK

P

CHAR (32)

supplOrd_ID

Integer

HUB_SupplierOrder_LDTS

Datetime

HUB_SupplierOrder_RSRC

NVARCHAR (50)

HUB_Warehouse

HUB_Warehouse_HSK

P

CHAR (32)

wareh_ID

Integer

HUB_Warehouse_LDTS

Datetime

HUB_Warehouse_RSRC

NVARCHAR (50)

LNK_Company_Contract

LNK_Company_Contract_HSK

P

CHAR (32)

LNK_Company_Contract_LDTS

Datetime

LNK_Company_Contract_RSRC

NVARCHAR (50)

HUB_Company_HSK

F

CHAR (32)

HUB_SalesContract_HSK

F

CHAR (32)

LNK_Company_Warehouse

LNK_Company_Warehouse_HSK

P

CHAR (32)

LNK_Company_Warehouse_LDTS

Datetime

LNK_Company_Warehouse_RSRC

NVARCHAR (50)

HUB_Company_HSK

F

CHAR (32)

HUB_Warehouse_HSK

F

CHAR (32)

LNK_CustomerOrder

LNK_CustomerOrder_HSK

P

CHAR (32)

LNK_CustomerOrder_LDTS

Datetime

LNK_CustomerOrder_RSRC

NVARCHAR (50)

HUB_CustomerOrder_HSK

F

CHAR (32)

HUB_Company_HSK

F

CHAR (32)

HUB_Customer_HSK

F

CHAR (32)

HUB_Warehouse_HSK

F

CHAR (32)

HUB_SalesContract_HSK

F

CHAR (32)

HUB_Responsible_HSK

F

CHAR (32)

LNK_CustomerOrder_Details

LNK_CustomerOrder_Details_HSK

P

CHAR (32)

LNK_CustomerOrder_Details_LDTS

Datetime

LNK_CustomerOrder_Details_RSRC

NVARCHAR (50)

HUB_CustomerOrder_HSK

F

CHAR (32)

HUB_Product_HSK

F

CHAR (32)

LNK_PLine_PCategory

LNK_PLine_PCategory_HSK

P

CHAR (32)

LNK_PLine_PCategory_LDTS

Datetime

LNK_PLine_PCategory_RSRC

NVARCHAR (50)

HUB_ProductLine_HSK

F

CHAR (32)

HUB_ProductCategory_HSK

F

CHAR (32)

LNK_Product_PLine

LNK_Product_PLine_HSK

P

CHAR (32)

LNK_Product_PLine_LDTS

Datetime

LNK_Product_PLine_RSRC

NVARCHAR (50)

HUB_Product_HSK

F

CHAR (32)

HUB_ProductLine_HSK

F

CHAR (32)

LNK_Sales

LNK_Sales_HSK

P

CHAR (32)

LNK_Sales_LDTS

Datetime

LNK_Sales_RSRC

NVARCHAR (50)

HUB_Sales_HSK

F

CHAR (32)

HUB_Company_HSK

F

CHAR (32)

HUB_Customer_HSK

F

CHAR (32)

HUB_Warehouse_HSK

F

CHAR (32)

HUB_SalesContract_HSK

F

CHAR (32)

HUB_Responsible_HSK

F

CHAR (32)

LNK_Sales_Details

LNK_Sales_Details_HSK

P

CHAR (32)

LNK_Sales_Details_LDTS

Datetime

LNK_Sales_Details_RSRC

NVARCHAR (50)

HUB_Sales_HSK

F

CHAR (32)

HUB_Product_HSK

F

CHAR (32)

LNK_SupplierOrder

LNK_SupplierOrder_HSK

P

CHAR (32)

LNK_SupplierOrder_LDTS

Datetime

LNK_SupplierOrder_RSRC

NVARCHAR (50)

HUB_SupplierOrder_HSK

F

CHAR (32)

HUB_Company_HSK

F

CHAR (32)

HUB_Supplier_HSK

F

CHAR (32)

HUB_Warehouse_HSK

F

CHAR (32)

HUB_SupplierContract_HSK

F

CHAR (32)

HUB_Responsible_HSK

F

CHAR (32)

LNK_SupplierOrder_Details

LNK_SupplierOrder_Details_HSK

P

CHAR (32)

LNK_SupplierOrder_Details_LDTS

Datetime

LNK_SupplierOrder_Details_RSRC

NVARCHAR (50)

HUB_SupplierOrder_HSK

F

CHAR (32)

HUB_Product_HSK

F

CHAR (32)

LNK_Supplier_Contract

LNK_Supplier_Contract_HSK

P

CHAR (32)

LNK_Supplier_Contract_LDTS

Datetime

LNK_Supplier_Contract_RSRC

NVARCHAR (50)

HUB_Supplier_HSK

F

CHAR (32)

HUB_SupplierContract_HSK

F

CHAR (32)

REF_Calendar

DateID

P

Integer

Day

CHAR (2)

DaySuffix

NVARCHAR (4)

DayOfWeek

NVARCHAR (9)

DOWInMonth

Integer

DayOfYear

Integer

WeekOfYear

Integer

WeekOfMonth

Integer

Month

CHAR (2)

MonthName

NVARCHAR (9)

Quarter

Integer

QuarterName

NVARCHAR (6)

Year

CHAR (4)

SAT_Company

CompanyCode

NVARCHAR (50)

CompanyName

NVARCHAR (50)

Address

NVARCHAR (100)

HUB_Company_HSK

P

F

CHAR (32)

SAT_Company_LDTS

P

Datetime

SAT_Company_RSRC

NVARCHAR (50)

SAT_Company_HDIFF

CHAR (32)

SAT_Customer

CustomerCode

NUMERIC (18)

CustomerName

NVARCHAR (50)

Address

NVARCHAR (100)

Email

NVARCHAR (50)

HUB_Customer_HSK

P

F

CHAR (32)

SAT_Customer_LDTS

P

Datetime

SAT_Customer_RSRC

NVARCHAR (50)

SAT_Customer_HDIFF

CHAR (32)

SAT_CustomerOrder

CustomerOrderNumber

NUMERIC (18)

OrderDate

Date

HUB_CustomerOrder_HSK

P

F

CHAR (32)

SAT_CustomerOrder_LDTS

P

Datetime

SAT_CustomerOrder_RSRC

NVARCHAR (50)

SAT_CustomerOrder_HDIFF

CHAR (32)

SAT_CustomerOrder_Details

Quantity

NUMERIC (18)

Price

REAL

Summ

REAL

LNK_CustomerOrder_Details_HSK

P

F

CHAR (32)

SAT_CustomerOrder_Details_LDTS

P

Datetime

SAT_CustomerOrder_Details_RSRC

NVARCHAR (50)

SAT_CustomerOrder_Details_HDIFF

CHAR (32)

SAT_Product

ProductName

NVARCHAR (255)

VendorCode

NVARCHAR (50)

Producer

NVARCHAR (50)

Price

REAL

HUB_Product_HSK

P

F

CHAR (32)

SAT_Product_LDTS

P

Datetime

SAT_Product_RSRC

NVARCHAR (50)

SAT_Product_HDIFF

CHAR (32)

SAT_ProductCategory

ProductCategoryName

NVARCHAR (50)

HUB_ProductCategory_HSK

P

F

CHAR (32)

SAT_ProductCategory_LDTS

P

Datetime

SAT_ProductCategory_RSRC

NVARCHAR (50)

SAT_ProductCategory_HDIFF

CHAR (32)

SAT_ProductLine

ProductLineName

NVARCHAR (100)

HUB_ProductLine_HSK

P

F

CHAR (32)

SAT_ProductLine_LDTS

P

Datetime

SAT_ProductLine_RSRC

NVARCHAR (50)

SAT_ProductLine_HDIFF

CHAR (32)

SAT_Responsible

ResponsibleCode

NVARCHAR (50)

ResponsibleName

NVARCHAR (50)

Email

NVARCHAR (50)

Telephone

NVARCHAR (20)

HUB_Responsible_HSK

P

F

CHAR (32)

SAT_Responsible_LDTS

P

Datetime

SAT_Responsible_RSRC

NVARCHAR (50)

SAT_Responsible_HDIFF

CHAR (32)

SAT_Sales

SalesDocNumber

NUMERIC (18)

DocumentDate

Date

HUB_Sales_HSK

P

F

CHAR (32)

SAT_Sales_LDTS

P

Datetime

SAT_Sales_RSRC

NVARCHAR (50)

SAT_Sales_HDIFF

CHAR (32)

SAT_SalesContract

ContractNumber

NVARCHAR (50)

Date

Date

FinishDate

Date

HUB_SalesContract_HSK

P

F

CHAR (32)

SAT_SalesContract_LDTS

P

Datetime

SAT_SalesContract_RSRC

NVARCHAR (50)

SAT_SalesContract_HDIFF

CHAR (32)

SAT_Sales_Details

Quantity

NUMERIC (18)

Price

REAL

Summ

REAL

LNK_Sales_Details_HSK

P

F

CHAR (32)

SAT_Sales_Details_LDTS

P

Datetime

SAT_Sales_Details_RSRC

NVARCHAR (50)

SAT_Sales_Details_HDIFF

CHAR (32)

SAT_Supplier

SupplierCode

NUMERIC (18)

SupplierName

NVARCHAR (50)

Address

NVARCHAR (100)

INN

NUMERIC (32)

HUB_Supplier_HSK

P

F

CHAR (32)

SAT_Supplier_LDTS

P

Datetime

SAT_Supplier_RSRC

NVARCHAR (50)

SAT_Supplier_HDIFF

CHAR (32)

SAT_SupplierContract

ContractNumber

NVARCHAR (50)

Date

Date

FinishDate

Date

HUB_SupplierContract_HSK

P

F

CHAR (32)

SAT_SupplierContract_LDTS

P

Datetime

SAT_SupplierContract_RSRC

NVARCHAR (50)

SAT_SupplierContract_HDIFF

CHAR (32)

SAT_SupplierOrder

SupplierOrderNumber

NUMERIC (18)

OrderDate

Date

HUB_SupplierOrder_HSK

P

F

CHAR (32)

SAT_SupplierOrder_LDTS

P

Datetime

SAT_SupplierOrder_RSRC

NVARCHAR (50)

SAT_SupplierOrder_HDIFF

CHAR (32)

SAT_SupplierOrder_Details

Quantity

NUMERIC (18)

Price

REAL

Summ

REAL

LNK_SupplierOrder_Details_HSK

P

F

CHAR (32)

SAT_SupplierOrder_Details_LDTS

P

Datetime

SAT_SupplierOrder_Details_RSRC

NVARCHAR (50)

SAT_SupplierOrder_Details_HDIFF

CHAR (32)

SAT_Warehouse

WarehouseCode

NVARCHAR (50)

WarehouseName

NVARCHAR (50)

WarehouseType

NVARCHAR (20)

HUB_Warehouse_HSK

P

F

CHAR (32)

SAT_Warehouse_LDTS

P

Datetime

SAT_Warehouse_RSRC

NVARCHAR (50)

SAT_Warehouse_HDIFF

CHAR (32)

DDL скрипт создания таблиц приведен в Приложении 2.

Общий вид физической структуры хранилища представлен на рис. 10. Синим цветом представлены таблицы Хабы, красны цветом - Связи, желтым цветом - Спутники.

3.4 Загрузка данных из источника средствами ETL

Чтобы корректно заполнить хранилище данными из источника, необходимо воспользоваться модулем ETL. Программный продукт Talend Data Integrator предоставляет широкий спектр возможностей по очистке, трансформации и загрузке данных на бесплатной основе.

Приступить к созданию ETL-процесса необходимо с настройки соединения к базе данных источника и к, собственно, целевому ХД. В данном случае удобнее всего воспользоваться JDBC-драйвером, как показано на рис. 11.

Рис. 11. Окно настройки соединения в Talend Data Integrator

Загрузка данных в Data Vault происходит в три шага. Первыми грузятся параллельно все Хабы, затем Связи, и последними загружаются Спутники. Т.к. все процессы по загрузке таблиц каждого типа идентичны, рассмотрим особенности всех трансформаций на примере таблицы источника Sales_Header.

Процесс по загрузке Хаба включает в себя извлечение данных из таблицы-источника, формирование суррогатного ключа Хаба с помощью алгоритма MD5, регистрация даты создания каждой записи (временная метка), мэппинг с целевой таблицей и отслеживание изменений в данных (рис. 12).

Рис. 12. Процесс загрузки Хаба

Суррогатный ключ Хаба формируется на основе бизнес-ключа таблицы источника. Во взятой для примера таблице Sales_Header таким ключом является поле SalesHeaderID. SQL-код создания суррогатного ключа Хаба представлен ниже:

UPPER(CONVERT(char(32),HASHBYTES('MD5',UPPER(RTRIM(LTRIM(CONVERT(varchar, COALESCE(Sales_Header.SalesHeaderID, '')))))),2))

В процессе по загрузке Связи в мэппинг включаются все Хабы, на которые Связь должна иметь ссылки (рис. 13).

Рис. 13. Процесс загрузки Связи

В формирование суррогатного ключа Связи помимо бизнес-ключа исходной таблицы включаются все внешние ключи. В таблице Sales_Header это CompanyID, CustomerID, SalesContractID, ResponsibleID, WarehouseID. SQL-код создания ключа:

UPPER(CONVERT(char(32),HASHBYTES('MD5',UPPER(RTRIM(LTRIM(CONVERT(varchar,COALESCE(Sales_Header.SalesHeaderID,'')))))+'|'+UPPER(RTRIM(LTRIM(CONVERT(varchar,COALESCE(Sales_Header.SalesContractID, '')))))+'|'+UPPER(RTRIM(LTRIM(CONVERT(varchar,COALESCE(Sales_Header.CompanyID, '')))))+'|'+ UPPER(RTRIM(LTRIM(CONVERT(varchar,COALESCE(Sales_Header.CustomerID,'')))))+'|'+ UPPER(RTRIM(LTRIM(CONVERT(varchar,COALESCE(Sales_Header.WarehouseID,'')))))+'|'+(UPPER(RTRIM(LTRIM(CONVERT(varchar,COALESCE(Sales_Header.ResponsibleID, ''))))))),2))

Для предотвращения случаев повторной загрузки существующих в ХД данных и получения последней актуальной записи применяется следующая конструкция:

SELECT l1.LNK_Sales_HSK,

l1.LNK_Sales_LDTS,

l1.LNK_Sales_RSRC,

l1.HUB_Sales_HSK,

l1.HUB_Company_HSK,

l1.HUB_Customer_HSK,

l1.HUB_Warehouse_HSK,

l1.HUB_SalesContract_HSK,

l1.HUB_Responsible_HSK

FROMLNK_Sales l1

WHERE l1.LNK_Sales_LDTS = (SELECT

MAX(l2.LNK_Sales_LDTS) as max from LNK_Sales l2

WHERE l1.LNK_Sales_HSK = l2.LNK_Sales_HSK)

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

Процесс загрузки Спутников отличается лишь отсутствием собственного суррогатного ключа. Спутники имеют составной первичный ключ из суррогатного ключа Хаба, атрибуты которого он хранит, и временной метки. Однако, у Спутника есть дополнительное поле, отслеживающее изменения в вышеупомянутых атрибутах. Запись в данное поле формируется также с помощью алгоритма MD5, но включает в себя бизнес-ключ таблицы источника и все описательные поля. В таблице Sales_Header описательными являются поля SalesDocNum и DocumentDate. SQL-код здесь выглядит следующим образом:

UPPER(CONVERT(char(32),HASHBYTES('MD5',UPPER(RTRIM(LTRIM(CONVERT(varchar,COALESCE(Sales_Header.SalesHeaderID, '')))))+'|'+ UPPER(RTRIM(LTRIM(CONVERT(varchar,COALESCE(Sales_Header.SalesDocNumber, '')))))+'|'+(UPPER(RTRIM(LTRIM(CONVERT(varchar, COALESCE(Sales_Header.DocumentDate, ''))))))),2))

Пример ETL-процесса для Спутника (рис. 14):

Рис. 14. Процесс загрузки Спутника

Talend Data Integrator позволяет выполнять несколько процессов в параллельном режиме, что намного ускоряет загрузку данных. Ниже представлен пример параллельной загрузки всех таблиц Связей (рис. 15).

Рис. 15. Параллельная загрузка всех Связей

Далее необходимо создать главный процесс, при запуске которого пользователь будет обновлять все данные в хранилище. Такой процесс будет последовательно запускать загрузку Хабов, затем Связей и, наконец, Спутников (рис. 16).

Рис. 16. Главный (Main) процесс

3.5 Создание витрины данных

Данные в хранилище Data Vault хранятся в сильно нормализованном виде 3NF в большом количестве разделенных таблиц, что затрудняет доступ к ним. Как упоминалось ранее во втором разделе данной работы, архитектура Data Vault включает в себя три яруса, последним из которых являются витрины данных. Для их реализации необходимо написать SQL-запросы по созданию представлений (views) на основе модели ХД, объединив бизнес-ключи Хабов с атрибутами Спутников. Код создания представлений приведен в Приложении 3.

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

Модель витрины данных представляет собой схему Снежинка и представлена в общем виде на рис. 17.

3.6 Создание мета-слоя с использованием SAP Business Objects

Так как ключевыми пользователями разрабатываемой системы являются аналитики и топ-менеджеры компании, в базис знаний которых не входит написание SQL-запросов для извлечения информации из ХД, то целесообразно будет предложить им программный продукт, упрощающий работу с данными.

В данной работе таким продуктом был выбран SAP Business Objects [15]. При помощи модуля Universe Designer можно создать, так называемый, юниверс - семантический слой, который изолирует конечного пользователя от технических подробностей структуры базы данных.

Business Objects помещает особый слой между пользователями и их данными, который называется семантическим слоем. Это упрощает процесс создания запросов к хранилищу данных, позволяя пользователям создавать запросы в терминах конкретного бизнеса, которые они хорошо понимают (например, «Доход от продаж» вместо названия соответствующего поля в хранилище данных). Business Objects переводит запрос в форму SQL и отправляет его на обработку.

Слой метаданных или семантический слой основывается на парадигме юниверсов, классов и объектов.

Юниверс - это бизнес-ориентированное отображение структуры данных в ХД: таблицы, колонки, связи между ними и т.д. Он состоит из набора объектов, сгруппированных в классы. Объекты отражают предметную область пользователей.

Методология разработки юниверсов состоит из двух основных фаз - создание физической модели хранилища данных (описание структуры ХД) и создание логических объектов на основе таблиц хранилища.

Процесс создания юниверса начинается с настройки соединения с ХД. В первой фазе идет описание всех таблиц, колонок и связей. Во второй фазе создаются объекты бизнеса путем SQL-запросов.

Реляционная структура и логическое представление созданного юниверса представлены на рис. 18.

Рис. 18. Юниверс в Universe Designer

3.7 Визуализация данных в аналитических отчетах

Построение отчетов осуществляется при помощи модуля Web Intelligence. Создание любого отчета начинается с выбора источника - юниверса, из которого необходимо получить данные. Выбрав ранее созданный юниверс, следует перейти к следующему шагу - построению запроса. Панель запросов выглядит так, как представлено на рис. 19.

Панель делится на три основных окна:

- Список объектов юниверса. Здесь расположены объекты, которые определены в юниверсе. Объекты сгруппированы по классам.

- Объекты результата. Окно объектов результата расположено в верхней части панели запросов. В него помещаются объекты, которые необходимы в отчете, т.е. те данные, которые нужно получить из ХД.

- Условия. В правом нижнем окне описываются ограничения, которые накладываются на запрос.

Синтаксис SQL генерируется в Web Intelligence автоматически после добавления объекта в запрос.

Далее представлены фрагменты разработанных отчетов (рис. 20-22).

Рис. 22. Фрагмент отчета «Продажи сотрудников за выбранный год»

Заключение

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

Был проведен анализ существующих методологий по созданию хранилища данных, а именно: ХД в третьей нормальной форме Билла Инмона и Star Schema Ральфа Кимбалла. В качестве основных недостатков вышеперечисленных подходов были выделены соответственно сложность реализации и отсутствие масштабируемости. Далее была подробно рассмотрена современная методология Data Vault, в соответствии с которой выполнялась работа.

Были выполнены следующие задачи:

- Анализ источника данных с выявлением ключевых бизнес-процессов.

- Проектирование хранилища данных по методологии Data Vault.

- Создание ETL-процессов по очистке и загрузке данных из источника в хранилище.

- Построение виртуальной витрины данных.

- Разработка семантического слоя в приложении для бизнес-аналитики.

- Визуализация данных в отчетах.

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

Перечень сокращений

ИС - Информационная система

ХД - Хранилище данных

ETL - Extract Transform Load

3NF - Third Normal Form

CIF - Corporate Information Factory

BPMN - Business Process Model and Notation

ER - Entity Relationship

BI - Business Intelligence

JDBC - Java DataBase Connectivity

СУБД - Система управления базами данных

Список используемой литературы

1. Васильев Р.Б., Калянов Г.Н., Лёвочкина Г.А. Управление развитием информационных систем. -- М.: Горячая линия - Телеком, 2009.

2. Rainer, R. Introduction to Information System: Support and Transforming Business Fourth Edition. New Jersey: John Wiley and Sons, Inc., 2012.

3. Onlinecampus.bu.edu, 'Management Information Systems and Decision-Making: An Overview'. URL: https://onlinecampus.bu.edu/bbcswebdav/pid-843933-dt-content-rid-2221759_1/courses/13sprgmetad715_ol/module_03a/metad715_m03l02t02_managementinfosystems.html (дата обращения: 10.04.2016).

4. Devlin, B. 'Temporal data reality: In BI, time is of the essence'. URL: http://searchbusinessanalytics.techtarget.com/feature/Temporal-data-reality-In-BI-time-is-of-the-essence (дата обращения: 10.04.2016).

5. Inmon, W.H., Imhoff, C., Sousa R. Corporate Information Factory. New Jersey: Wiley, 2001.

6. Inmon W.H. 'The evolution of corporate information factory'. URL: http://www.ewsolutions.com/resource-center/rwds_folder/rwds-archives/rwds-2001-10/corporate-information-factory (дата обращения: 12.04.2016).

7. Centhala S. 'Comparison of Bill Inmon and Ralph Kimball paradigm', 2009. URL: http://srinicenthala.blogspot.ru/2009/01/comparison-of-bill-inmon-and-ralph.html (дата обращения: 13.04.2016).

8. Kimball, R., Ross, M. The Data Warehouse Toolkit: The Definitive Guide to Dimensional Modeling. New Jersey: Wiley, 2013.

9. Zentut.com, 'Kimball vs. Inmon Data Warehouse Architectures'. URL: http://www.zentut.com/data-warehouse/kimball-and-inmon-data-warehouse-architectures/ (дата обращения: 13.04.2016).

10. Breslin, M. 'Data Warehousing Battle of Giants: Comparing the Basics of the Kimball and Inmon Models'. URL: http://www.olap.it/Articoli/Battle%20of%20the%20giants%20-%20comparing%20Kimball%20and%20Inmon.pdf (дата обращения: 16.04.2016).

11. Linstedt, D. 'Data Vault Series 1 - Overview', 2002. URL: http://tdan.com/data-vault-series-1-data-vault-overview/5054 (дата обращения: 17.04.2016).

12. Linstedt, D. Super Charge Your Data Warehouse. North Charslton: Createspace, 2011.

13. Linstedt, D. 'Data Vault Introduction and Overview', 2013. URL: http://biblogg.no/2013/02/15/data-vault-introduction-and-overview/ (дата обращения: 17.04.2016).

14. Businessstudio.ru, 'Нотация BPMN'. URL: http://www.businessstudio.ru/wiki/docs/v4/doku.php/ru/csdesign/bpmodeling/bpmn_notation (дата обращения: 19.04.2016).

15. Tadviser.ru, 'SAP Business Intelligence', 2015. URL: http://www.tadviser.ru/index.php/%D0%9F%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82:SAP_Business_Intelligence_(SAP_BI) (дата обращения: 28.04.2016).

Приложения

Приложение 1

SQL-скрипт создания и заполнения таблицы «Календарь»

Приложение 2

SQL-скрипт создания таблиц в хранилище данных Data Vault

create table HUB_Customer (

HUB_Customer_HSK char(32) not null,

cust_ID int,

HUB_Customer_LDTS datetime,

HUB_Customer_RSRC nvarchar(50),

PRIMARY KEY(HUB_Customer_HSK)

);

create table HUB_Company (

HUB_Company_HSK char(32) not null,

comp_ID int,

HUB_Company_LDTS datetime,

HUB_Company_RSRC nvarchar(50),

PRIMARY KEY(HUB_Company_HSK)

);

create table HUB_SalesContract (

HUB_SalesContract_HSK char(32) not null,

salesC_ID int,

HUB_SalesContract_LDTS datetime,

HUB_SalesContract_RSRC nvarchar(50),

PRIMARY KEY(HUB_SalesContract_HSK)

);

create table HUB_Warehouse (

HUB_Warehouse_HSK char(32) not null,

wareh_ID int,

HUB_Warehouse_LDTS datetime,

HUB_Warehouse_RSRC nvarchar(50),

PRIMARY KEY(HUB_Warehouse_HSK)

);

create table HUB_Supplier (

HUB_Supplier_HSK char(32) not null,

suppl_ID int,

HUB_Supplier_LDTS datetime,

HUB_Supplier_RSRC nvarchar(50),

PRIMARY KEY(HUB_Supplier_HSK)

);

create table HUB_Responsible (

HUB_Responsible_HSK char(32) not null,

resp_ID int,

HUB_Responsible_LDTS datetime,

HUB_Responsible_RSRC nvarchar(50),

PRIMARY KEY(HUB_Responsible_HSK)

);

create table HUB_SupplierContract (

HUB_SupplierContract_HSK char(32) not null,

supplC_ID int,

HUB_SupplierContract_LDTS datetime,

HUB_SupplierContract_RSRC nvarchar(50),

PRIMARY KEY(HUB_SupplierContract_HSK)

);

create table HUB_Product (

HUB_Product_HSK char(32) not null,

prod_ID int,

HUB_Product_LDTS datetime,

HUB_Product_RSRC nvarchar(50),

PRIMARY KEY(HUB_Product_HSK)

);

create table HUB_ProductLine (

HUB_ProductLine_HSK char(32) not null,

prodLine_ID int,

HUB_ProductLine_LDTS datetime,

HUB_ProductLine_RSRC nvarchar(50),

PRIMARY KEY(HUB_ProductLine_HSK)

);

create table HUB_ProductCategory (

HUB_ProductCategory_HSK char(32) not null,

prodCat_ID int,

HUB_ProductCategory_LDTS datetime,

HUB_ProductCategory_RSRC nvarchar(50),

PRIMARY KEY(HUB_ProductCategory_HSK)

);

create table HUB_Sales (

HUB_Sales_HSK char(32) not null,

sales_ID int,

HUB_Sales_LDTS datetime,

HUB_Sales_RSRC nvarchar(50),

PRIMARY KEY(HUB_Sales_HSK)

);

create table HUB_CustomerOrder (

HUB_CustomerOrder_HSK char(32) not null,

custOrd_ID int,

HUB_CustomerOrder_LDTS datetime,

HUB_CustomerOrder_RSRC nvarchar(50),

PRIMARY KEY(HUB_CustomerOrder_HSK)

);

create table HUB_SupplierOrder (

HUB_SupplierOrder_HSK char(32) not null,

supplOrd_ID int,

HUB_SupplierOrder_LDTS datetime,

HUB_SupplierOrder_RSRC nvarchar(50),

PRIMARY KEY(HUB_SupplierOrder_HSK)

);

create table LNK_Sales (

LNK_Sales_HSK char(32) not null,

LNK_Sales_LDTS datetime,

LNK_Sales_RSRC nvarchar(50),

HUB_Sales_HSK char(32) not null,

HUB_Company_HSK char(32) not null,

HUB_Customer_HSK char(32) not null,

HUB_Warehouse_HSK char(32) not null,

HUB_SalesContract_HSK char(32) not null,

HUB_Responsible_HSK char(32) not null

PRIMARY KEY (LNK_Sales_HSK)

);

create table LNK_CustomerOrder (

LNK_CustomerOrder_HSK char(32) not null,

LNK_CustomerOrder_LDTS datetime,

LNK_CustomerOrder_RSRC nvarchar(50),

HUB_CustomerOrder_HSK char(32) not null,

HUB_Company_HSK char(32) not null,

HUB_Customer_HSK char(32) not null,

HUB_Warehouse_HSK char(32) not null,

HUB_SalesContract_HSK char(32) not null,

HUB_Responsible_HSK char(32) not null

PRIMARY KEY (LNK_CustomerOrder_HSK)

);

create table LNK_SupplierOrder (

LNK_SupplierOrder_HSK char(32) not null,

LNK_SupplierOrder_LDTS datetime,

LNK_SupplierOrder_RSRC nvarchar(50),

HUB_SupplierOrder_HSK char(32) not null,

HUB_Company_HSK char(32) not null,

HUB_Supplier_HSK char(32) not null,

HUB_Warehouse_HSK char(32) not null,

HUB_SupplierContract_HSK char(32) not null,

HUB_Responsible_HSK char(32) not null

PRIMARY KEY (LNK_SupplierOrder_HSK)

);

create table LNK_Sales_Details (

LNK_Sales_Details_HSK char(32) not null,

LNK_Sales_Details_LDTS datetime,

LNK_Sales_Details_RSRC nvarchar(50),

HUB_Sales_HSK char(32) not null,

HUB_Product_HSK char(32) not null,

salesDID int,

PRIMARY KEY (LNK_Sales_Details_HSK)

);

create table LNK_CustomerOrder_Details (

LNK_CustomerOrder_Details_HSK char(32) not null,

LNK_CustomerOrder_Details_LDTS datetime,

LNK_CustomerOrder_Details_RSRC nvarchar(50),

HUB_CustomerOrder_HSK char(32) not null,

HUB_Product_HSK char(32) not null,

custODID int,

PRIMARY KEY (LNK_CustomerOrder_Details_HSK)

);

create table LNK_SupplierOrder_Details (

LNK_SupplierOrder_Details_HSK char(32) not null,

LNK_SupplierOrder_Details_LDTS datetime,

LNK_SupplierOrder_Details_RSRC nvarchar(50),

HUB_SupplierOrder_HSK char(32) not null,

HUB_Product_HSK char(32) not null,

suppODID int,

PRIMARY KEY (LNK_SupplierOrder_Details_HSK)

);

create table LNK_Product_PLine (

LNK_Product_PLine_HSK char(32) not null,

LNK_Product_PLine_LDTS datetime,

LNK_Product_PLine_RSRC nvarchar(50),

HUB_Product_HSK char(32) not null,

HUB_ProductLine_HSK char(32) not null,

PRIMARY KEY (LNK_Product_PLine_HSK)

);

create table LNK_PLine_PCategory (

LNK_PLine_PCategory_HSK char(32) not null,

LNK_PLine_PCategory_LDTS datetime,

LNK_PLine_PCategory_RSRC nvarchar(50),

HUB_ProductLine_HSK char(32) not null,

HUB_ProductCategory_HSK char(32) not null,

PRIMARY KEY (LNK_PLine_PCategory_HSK)

);

create table LNK_Company_Warehouse (

LNK_Company_Warehouse_HSK char(32) not null,

LNK_Company_Warehouse_LDTS datetime,

LNK_Company_Warehouse_RSRC nvarchar(50),

HUB_Company_HSK char(32) not null,

HUB_Warehouse_HSK char(32) not null,

PRIMARY KEY (LNK_Company_Warehouse_HSK)

);

create table LNK_Company_Contract (

LNK_Company_Contract_HSK char(32) not null,

LNK_Company_Contract_LDTS datetime,

LNK_Company_Contract_RSRC nvarchar(50),

HUB_Company_HSK char(32) not null,

HUB_SalesContract_HSK char(32) not null,

PRIMARY KEY (LNK_Company_Contract_HSK)

);

create table LNK_Supplier_Contract (

LNK_Supplier_Contract_HSK char(32) not null,

LNK_Supplier_Contract_LDTS datetime,

LNK_Supplier_Contract_RSRC nvarchar(50),

HUB_Supplier_HSK char(32) not null,

HUB_SupplierContract_HSK char(32) not null,

PRIMARY KEY (LNK_Supplier_Contract_HSK)

);

create table SAT_Product (

ProductName nvarchar(255) not null,

VendorCode nvarchar(50) not null,

Producer nvarchar(50) not null,

Price real not null,

HUB_Product_HSK char(32) not null,

SAT_Product_LDTS datetime not null,

SAT_Product_RSRC nvarchar(50),

SAT_Product_HDIFF char(32),

PRIMARY KEY (HUB_Product_HSK, SAT_Product_LDTS),

FOREIGN KEY (HUB_Product_HSK) REFERENCES HUB_Product (HUB_Product_HSK)

);

create table SAT_ProductLine (

ProductLineName nvarchar(100) not null,

HUB_ProductLine_HSK char(32) not null,

SAT_ProductLine_LDTS datetime not null,

SAT_ProductLine_RSRC nvarchar(50),

SAT_ProductLine_HDIFF char(32),

PRIMARY KEY (HUB_ProductLine_HSK, SAT_ProductLine_LDTS),

FOREIGN KEY (HUB_ProductLine_HSK) REFERENCES HUB_ProductLine (HUB_ProductLine_HSK)

);

create table SAT_ProductCategory (

ProductCategoryName nvarchar(50) not null,

HUB_ProductCategory_HSK char(32) not null,

SAT_ProductCategory_LDTS datetime not null,

SAT_ProductCategory_RSRC nvarchar(50),

SAT_ProductCategory_HDIFF char(32),

PRIMARY KEY (HUB_ProductCategory_HSK, SAT_ProductCategory_LDTS),

FOREIGN KEY (HUB_ProductCategory_HSK) REFERENCES HUB_ProductCategory (HUB_ProductCategory_HSK)

);

create table SAT_Responsible (

ResponsibleCode nvarchar(50) not null,

ResponsibleName nvarchar(50) not null,

Email nvarchar(50) not null,

Telephone nvarchar(20) not null,

HUB_Responsible_HSK char(32) not null,

SAT_Responsible_LDTS datetime not null,

SAT_Responsible_RSRC nvarchar(50),

SAT_Responsible_HDIFF char(32),

PRIMARY KEY (HUB_Responsible_HSK, SAT_Responsible_LDTS),

FOREIGN KEY (HUB_Responsible_HSK) REFERENCES HUB_Responsible (HUB_Responsible_HSK)

);

create table SAT_Supplier (

SupplierCode numeric(18) not null,

SupplierName nvarchar(50) not null,

Address nvarchar(100) not null,

INN numeric(32) not null,

HUB_Supplier_HSK char(32) not null,

SAT_Supplier_LDTS datetime not null,

SAT_Supplier_RSRC nvarchar(50),

SAT_Supplier_HDIFF char(32),

PRIMARY KEY (HUB_Supplier_HSK, SAT_Supplier_LDTS),

FOREIGN KEY (HUB_Supplier_HSK) REFERENCEs HUB_Supplier (HUB_Supplier_HSK)

);

create table SAT_SupplierContract (

ContractNumber nvarchar(50) not null,

Date date not null,

FinishDate date,

HUB_SupplierContract_HSK char(32) not null,

SAT_SupplierContract_LDTS datetime not null,

SAT_SupplierContract_RSRC nvarchar(50),

SAT_SupplierContract_HDIFF char(32),

PRIMARY KEY (HUB_SupplierContract_HSK, SAT_SupplierContract_LDTS),

FOREIGN KEY (HUB_SupplierContract_HSK) REFERENCEs HUB_SupplierContract (HUB_SupplierContract_HSK)

);

create table SAT_SalesContract (

ContractNumber nvarchar(50) not null,

Date date not null,

FinishDate date not null,

HUB_SalesContract_HSK char(32) not null,

SAT_SalesContract_LDTS datetime not null,

SAT_SalesContract_RSRC nvarchar(50),

SAT_SalesContract_HDIFF char(32),

PRIMARY KEY (HUB_SalesContract_HSK, SAT_SalesContract_LDTS),

FOREIGN KEY (HUB_SalesContract_HSK) REFERENCEs HUB_SalesContract (HUB_SalesContract_HSK)

);

create table SAT_Company (

CompanyCode nvarchar(50) not null,

CompanyName nvarchar(50) not null,

Address nvarchar(100) not null,

HUB_Company_HSK char(32) not null,

SAT_Company_LDTS datetime not null,

SAT_Company_RSRC nvarchar(50),

SAT_Company_HDIFF char(32),

PRIMARY KEY (HUB_Company_HSK, SAT_Company_LDTS),

FOREIGN KEY (HUB_Company_HSK) REFERENCEs HUB_Company (HUB_Company_HSK)

);

create table SAT_Warehouse (

WarehouseCode nvarchar(50) not null,

WarehouseName nvarchar(50) not null,

WarehouseType nvarchar(20) not null,

HUB_Warehouse_HSK char(32) not null,

SAT_Warehouse_LDTS datetime not null,

SAT_Warehouse_RSRC nvarchar(50),

SAT_Warehouse_HDIFF char(32),

PRIMARY KEY (HUB_Warehouse_HSK, SAT_Warehouse_LDTS),

FOREIGN KEY (HUB_Warehouse_HSK) REFERENCEs HUB_Warehouse (HUB_Warehouse_HSK)

);

create table SAT_Customer (

CustomerCode numeric(18) not null,

CustomerName nvarchar(50) not null,

Address nvarchar(100) not null,

Email nvarchar(50) not null,

HUB_Customer_HSK char(32) not null,

SAT_Customer_LDTS datetime not null,

SAT_Customer_RSRC nvarchar(50),

SAT_Customer_HDIFF char(32),

PRIMARY KEY (HUB_Customer_HSK, SAT_Customer_LDTS),

FOREIGN KEY (HUB_Customer_HSK) REFERENCEs HUB_Customer (HUB_Customer_HSK)

);

create table SAT_CustomerOrder (

CustomerOrderNumber numeric(18) not null,

OrderDate date not null,

HUB_CustomerOrder_HSK char(32) not null,

SAT_CustomerOrder_LDTS datetime not null,

SAT_CustomerOrder_RSRC nvarchar(50),

SAT_CustomerOrder_HDIFF char(32),

PRIMARY KEY (HUB_CustomerOrder_HSK, SAT_CustomerOrder_LDTS),

FOREIGN KEY (HUB_CustomerOrder_HSK) REFERENCEs HUB_CustomerOrder (HUB_CustomerOrder_HSK)

);

create table SAT_SupplierOrder (

SupplierOrderNumber numeric(18) not null,

OrderDate date not null,

HUB_SupplierOrder_HSK char(32) not null,

SAT_SupplierOrder_LDTS datetime not null,

SAT_SupplierOrder_RSRC nvarchar(50),

SAT_SupplierOrder_HDIFF char(32),

PRIMARY KEY (HUB_SupplierOrder_HSK, SAT_SupplierOrder_LDTS),

FOREIGN KEY (HUB_SupplierOrder_HSK) REFERENCEs HUB_SupplierOrder (HUB_SupplierOrder_HSK)

);

create table SAT_Sales (

SalesDocNumber numeric(18) not null,

DocumentDate date not null,

HUB_Sales_HSK char(32) not null,

SAT_Sales_LDTS datetime not null,

SAT_Sales_RSRC nvarchar(50),

SAT_Sales_HDIFF char(32),

PRIMARY KEY (HUB_Sales_HSK, SAT_Sales_LDTS),

FOREIGN KEY (HUB_Sales_HSK) REFERENCEs HUB_Sales (HUB_Sales_HSK)

);

create table SAT_Sales_Details (

Quantity numeric(18) not null,

Price real not null,

Summ real not null,

LNK_Sales_Details_HSK char(32) not null,

SAT_Sales_Details_LDTS datetime not null,

SAT_Sales_Details_RSRC nvarchar(50),

SAT_Sales_Details_HDIFF char(32),

PRIMARY KEY (LNK_Sales_Details_HSK, SAT_Sales_Details_LDTS),

FOREIGN KEY (LNK_Sales_Details_HSK) REFERENCEs LNK_Sales_Details (LNK_Sales_Details_HSK)

);

create table SAT_CustomerOrder_Details (

Quantity numeric(18) not null,

Price real not null,

Summ real not null,

LNK_CustomerOrder_Details_HSK char(32) not null,

SAT_CustomerOrder_Details_LDTS datetime not null,

SAT_CustomerOrder_Details_RSRC nvarchar(50),

SAT_CustomerOrder_Details_HDIFF char(32),

PRIMARY KEY (LNK_CustomerOrder_Details_HSK, SAT_CustomerOrder_Details_LDTS),

FOREIGN KEY (LNK_CustomerOrder_Details_HSK) REFERENCEs LNK_CustomerOrder_Details (LNK_CustomerOrder_Details_HSK)

);

create table SAT_SupplierOrder_Details (

Quantity numeric(18) not null,

Price real not null,

Summ real not null,

LNK_SupplierOrder_Details_HSK char(32) not null,

SAT_SupplierOrder_Details_LDTS datetime not null,

SAT_SupplierOrder_Details_RSRC nvarchar(50),

SAT_SupplierOrder_Details_HDIFF char(32),

PRIMARY KEY (LNK_SupplierOrder_Details_HSK, SAT_SupplierOrder_Details_LDTS),

FOREIGN KEY (LNK_SupplierOrder_Details_HSK) REFERENCEs LNK_SupplierOrder_Details (LNK_SupplierOrder_Details_HSK)

);

Приложение 3

SQL-скрипт создания представлений

USE DWH_DataVault go

CREATE VIEW dimCompany AS SELECT hc.HUB_Company_HSK AS CompanyHSK,sc.CompanyCode,sc.CompanyName,sc.Address,hc.comp_ID AS CompanyID

FROM HUB_Company hc, SAT_Company sc

WHERE hc.HUB_Company_HSK=sc.HUB_Company_HSK AND sc.SAT_Company_LDTS = (SELECT

MAX(sc2.SAT_Company_LDTS) FROM SAT_Company sc2 WHERE sc.HUB_Company_HSK=sc2.HUB_Company_HSK);

CREATE VIEW dimProduct AS SELECT hp.HUB_Product_HSK AS ProductHSK, lpp.HUB_ProductLine_HSK AS ProductLineHSK, sp.ProductName, sp.VendorCode,

sp.Producer, sp.Price, hp.prod_ID AS ProductID, hpl.prodLine_ID AS ProductLineID

FROM HUB_Product hp, SAT_Product sp, LNK_Product_PLine lpp, HUB_ProductLine hpl

WHERE hpl.HUB_ProductLine_HSK=lpp.HUB_ProductLine_HSK AND hp.HUB_Product_HSK=sp.HUB_Product_HSK AND lpp.HUB_Product_HSK=hp.HUB_Product_HSK AND sp.SAT_Product_LDTS = (SELECT

MAX(sp2.SAT_Product_LDTS) FROM SAT_Product sp2 WHERE sp.HUB_Product_HSK=sp2.HUB_Product_HSK) AND lpp.LNK_Product_PLine_LDTS = (SELECT

MAX(lpp2.LNK_Product_PLine_LDTS) FROM LNK_Product_PLine lpp2 WHERE lpp.HUB_Product_HSK=lpp2.HUB_Product_HSK);

CREATE VIEW dimCustomer AS SELECT hc.HUB_Customer_HSK AS CustomerHSK, sc.CustomerCode,sc.CustomerName,sc.Address,sc.Email,hc.cust_ID AS CustomerID

FROM HUB_Customer hc, SAT_Customer sc

WHERE hc.HUB_Customer_HSK=sc.HUB_Customer_HSK AND sc.SAT_Customer_LDTS = (SELECT

MAX (sc2.SAT_Customer_LDTS) FROM SAT_Customer sc2 WHERE sc.HUB_Customer_HSK=sc2.HUB_Customer_HSK);

CREATE VIEW dimProductCategory AS SELECT hpc.HUB_ProductCategory_HSK as ProductCategoryHSK,spc.ProductCategoryName,hpc.prodCat_ID as ProductCategoryID

FROM HUB_ProductCategory hpc,SAT_ProductCategory spc

WHERE hpc.HUB_ProductCategory_HSK=spc.HUB_ProductCategory_HSK AND spc.SAT_ProductCategory_LDTS = (SELECT

MAX (spc2.SAT_ProductCategory_LDTS) FROM SAT_ProductCategory spc2 WHERE spc.HUB_ProductCategory_HSK=spc2.HUB_ProductCategory_HSK);

CREATE VIEW dimProductLine AS SELECT hpl.HUB_ProductLine_HSK AS ProductLineHSK, lpp.HUB_ProductCategory_HSK AS ProductCategoryHSK, spl.ProductLineName,

hpl.prodLine_ID AS ProductLineID, hpc.prodCat_ID AS ProductCategoryID

FROM HUB_ProductLine hpl, SAT_ProductLine spl, LNK_PLine_PCategory lpp, HUB_ProductCategory hpc

WHERE hpc.HUB_ProductCategory_HSK=lpp.HUB_ProductCategory_HSK AND hpl.HUB_ProductLine_HSK=spl.HUB_ProductLine_HSK AND hpl.HUB_ProductLine_HSK=lpp.HUB_ProductLine_HSK AND spl.SAT_ProductLine_LDTS = (SELECT

MAX(spl2.SAT_ProductLine_LDTS) FROM SAT_ProductLine spl2 WHERE spl.HUB_ProductLine_HSK=spl2.HUB_ProductLine_HSK) AND lpp.LNK_PLine_PCategory_LDTS = (SELECT

MAX(lpp2.LNK_PLine_PCategory_LDTS) FROM LNK_PLine_PCategory lpp2 WHERE lpp.HUB_ProductLine_HSK=lpp2.HUB_ProductLine_HSK);

CREATE VIEW dimResponsible AS SELECT hr.HUB_Responsible_HSK AS ResponsibleHSK,sr.ResponsibleCode,sr.ResponsibleName,sr.Email,sr.Telephone,hr.resp_ID AS ResponsibleID

FROM HUB_Responsible hr, SAT_Responsible sr

WHERE hr.HUB_Responsible_HSK=sr.HUB_Responsible_HSK AND sr.SAT_Responsible_LDTS = (SELECT

MAX(sr2.SAT_Responsible_LDTS) FROM SAT_Responsible sr2 WHERE sr.HUB_Responsible_HSK=sr2.HUB_Responsible_HSK);

CREATE VIEW dimWarehouse AS SELECT hw.HUB_Warehouse_HSK AS WarehouseHSK,lcw.HUB_Company_HSK AS CompanyHSK,sw.WarehouseCode,sw.WarehouseName,sw.WarehouseType,

hw.wareh_ID AS WarehouseID,hc.comp_ID as CompanyID

FROM HUB_Warehouse hw, LNK_Company_Warehouse lcw, SAT_Warehouse sw, HUB_Company hc

WHERE hc.HUB_Company_HSK=lcw.HUB_Company_HSK AND hw.HUB_Warehouse_HSK=sw.HUB_Warehouse_HSK AND hw.HUB_Warehouse_HSK=lcw.HUB_Warehouse_HSK AND sw.SAT_Warehouse_LDTS = (SELECT

MAX(sw2.SAT_Warehouse_LDTS) FROM SAT_Warehouse sw2 WHERE sw.HUB_Warehouse_HSK=sw2.HUB_Warehouse_HSK) AND lcw.LNK_Company_Warehouse_LDTS = (SELECT

MAX(lcw2.LNK_Company_Warehouse_LDTS) FROM LNK_Company_Warehouse lcw2 WHERE lcw.HUB_Warehouse_HSK=lcw2.HUB_Warehouse_HSK);

CREATE VIEW dimSupplier AS SELECT hs.HUB_Supplier_HSK AS SupplierHSK,ss.SupplierCode,ss.SupplierName,ss.Address,ss.INN,hs.suppl_ID AS SupplierID

FROM HUB_Supplier hs, SAT_Supplier ss

WHERE hs.HUB_Supplier_HSK=ss.HUB_Supplier_HSK AND ss.SAT_Supplier_LDTS = (SELECT

MAX(ss2.SAT_Supplier_LDTS) FROM SAT_Supplier ss2 WHERE ss.HUB_Supplier_HSK=ss2.HUB_Supplier_HSK);

CREATE VIEW dimSalesContract AS SELECT hsc.HUB_SalesContract_HSK AS SalesContractHSK,lcc.HUB_Company_HSK AS CompanyHSK,ssc.ContractNumber,ssc.Date,ssc.FinishDate,

hsc.salesC_ID AS SalesContractID, hc.comp_ID as CompanyID

FROM HUB_SalesContract hsc, LNK_Company_Contract lcc, SAT_SalesContract ssc, HUB_Company hc

WHERE hc.HUB_Company_HSK=lcc.HUB_Company_HSK AND hsc.HUB_SalesContract_HSK=ssc.HUB_SalesContract_HSK AND hsc.HUB_SalesContract_HSK=lcc.HUB_SalesContract_HSK AND ssc.SAT_SalesContract_LDTS = (SELECT

MAX(ssc2.SAT_SalesContract_LDTS) FROM SAT_SalesContract ssc2 WHERE ssc.HUB_SalesContract_HSK=ssc2.HUB_SalesContract_HSK) AND lcc.LNK_Company_Contract_LDTS = (SELECT

MAX(lcc2.LNK_Company_Contract_LDTS) FROM LNK_Company_Contract lcc2 WHERE lcc.HUB_SalesContract_HSK=lcc2.HUB_SalesContract_HSK);

CREATE VIEW dimSupplierContract AS SELECT hsc.HUB_SupplierContract_HSK AS SupplierContractHSK,lsc.HUB_Supplier_HSK AS SupplierHSK,ssc.ContractNumber,ssc.Date,ssc.FinishDate,

hsc.supplC_ID AS SupplierContractID,hs.suppl_ID as SupplierID

FROM HUB_SupplierContract hsc, LNK_Supplier_Contract lsc, SAT_SupplierContract ssc, HUB_Supplier hs

WHERE hs.HUB_Supplier_HSK=lsc.HUB_Supplier_HSK AND hsc.HUB_SupplierContract_HSK=ssc.HUB_SupplierContract_HSK AND hsc.HUB_SupplierContract_HSK=lsc.HUB_SupplierContract_HSK AND ssc.SAT_SupplierContract_LDTS = (SELECT

MAX(ssc2.SAT_SupplierContract_LDTS) FROM SAT_SupplierContract ssc2 WHERE ssc.HUB_SupplierContract_HSK=ssc2.HUB_SupplierContract_HSK) AND lsc.LNK_Supplier_Contract_LDTS = (SELECT

MAX(lsc2.LNK_Supplier_Contract_LDTS) FROM LNK_Supplier_Contract lsc2 WHERE lsc.HUB_SupplierContract_HSK=lsc2.HUB_SupplierContract_HSK);

CREATE VIEW factSales AS SELECT hs.HUB_Sales_HSK AS SalesHSK, lsd.LNK_Sales_Details_HSK AS SalesDetailsHSK,ls.HUB_Company_HSK AS CompanyHSK,

ls.HUB_Customer_HSK AS CustomerHSK,ls.HUB_Warehouse_HSK as WarehouseHSK,ls.HUB_SalesContract_HSK as SalesContractHSK,

ls.HUB_Responsible_HSK AS ResponsibleHSK,lsd.HUB_Product_HSK AS ProductHSK,ss.DocumentDate,ssd.Quantity,ssd.Price,ssd.Summ,hs.sales_ID AS SalesID,

lsd.salesDID AS SalesDetailsID,hp.prod_ID AS ProductID

FROM HUB_Sales hs, LNK_Sales_Details lsd, SAT_Sales ss, SAT_Sales_Details ssd, LNK_Sales ls, HUB_Product hp

WHERE hp.HUB_Product_HSK=lsd.HUB_Product_HSK AND hs.HUB_Sales_HSK=ss.HUB_Sales_HSK AND hs.HUB_Sales_HSK=lsd.HUB_Sales_HSK AND ssd.LNK_Sales_Details_HSK=lsd.LNK_Sales_Details_HSK AND

ls.HUB_Sales_HSK=hs.HUB_Sales_HSK AND ss.SAT_Sales_LDTS = (SELECT MAX(ss2.SAT_Sales_LDTS) FROM SAT_Sales ss2 WHERE ss.HUB_Sales_HSK=ss2.HUB_Sales_HSK) AND

ssd.SAT_Sales_Details_LDTS = (SELECT MAX(ssd2.SAT_Sales_Details_LDTS) FROM SAT_Sales_Details ssd2 WHERE ssd.LNK_Sales_Details_HSK=ssd2.LNK_Sales_Details_HSK) AND

ls.LNK_Sales_LDTS = (SELECT MAX(ls2.LNK_Sales_LDTS) FROM LNK_Sales ls2 WHERE ls.HUB_Sales_HSK=ls2.HUB_Sales_HSK) AND

lsd.LNK_Sales_Details_LDTS = (SELECT MAX(lsd2.LNK_Sales_Details_LDTS) FROM LNK_Sales_Details lsd2 WHERE lsd.LNK_Sales_Details_HSK = lsd2.LNK_Sales_Details_HSK);

CREATE VIEW factCustomerOrder AS SELECT hco.HUB_CustomerOrder_HSK AS CustomerOrderHSK, lcod.LNK_CustomerOrder_Details_HSK as CustomerOrderDetailsHSK, lco.HUB_Company_HSK AS CompanyHSK,

lco.HUB_Customer_HSK AS CustomerHSK, lco.HUB_Warehouse_HSK as WarehouseHSK, lco.HUB_SalesContract_HSK AS SalesContractHSK, lco.HUB_Responsible_HSK AS ResponsibleHSK,

lcod.HUB_Product_HSK as ProductHSK, sco.OrderDate, scod.Quantity, scod.Price, scod.Summ,

hco.custOrd_ID as CustomerOrderID, lcod.custODID as CustomerOrderDetailsID, hp.prod_ID as ProductID

FROM HUB_CustomerOrder hco, LNK_CustomerOrder lco, LNK_CustomerOrder_Details lcod, SAT_CustomerOrder sco, SAT_CustomerOrder_Details scod, HUB_Product hp

WHERE hp.HUB_Product_HSK=lcod.HUB_Product_HSK AND hco.HUB_CustomerOrder_HSK=sco.HUB_CustomerOrder_HSK AND hco.HUB_CustomerOrder_HSK=lco.HUB_CustomerOrder_HSK AND

lcod.LNK_CustomerOrder_Details_HSK=scod.LNK_CustomerOrder_Details_HSK AND hco.HUB_CustomerOrder_HSK=lcod.HUB_CustomerOrder_HSK AND

sco.SAT_CustomerOrder_LDTS = (SELECT MAX(sco2.SAT_CustomerOrder_LDTS) FROM SAT_CustomerOrder sco2 WHERE sco.HUB_CustomerOrder_HSK=sco2.HUB_CustomerOrder_HSK) AND

scod.SAT_CustomerOrder_Details_LDTS = (SELECT MAX(scod2.SAT_CustomerOrder_Details_LDTS) FROM SAT_CustomerOrder_Details scod2 WHERE scod.LNK_CustomerOrder_Details_HSK=scod2.LNK_CustomerOrder_Details_HSK) AND

lco.LNK_CustomerOrder_LDTS = (SELECT MAX(lco2.LNK_CustomerOrder_LDTS) FROM LNK_CustomerOrder lco2 WHERE lco.HUB_CustomerOrder_HSK=lco2.HUB_CustomerOrder_HSK) AND

lcod.LNK_CustomerOrder_Details_LDTS = (SELECT MAX(lcod2.LNK_CustomerOrder_Details_LDTS) FROM LNK_CustomerOrder_Details lcod2 WHERE lcod.HUB_CustomerOrder_HSK=lcod2.HUB_CustomerOrder_HSK);

CREATE VIEW factSupplierOrder AS SELECT hso.HUB_SupplierOrder_HSK AS SupplierOrderHSK, lsod.LNK_SupplierOrder_Details_HSK as SupplierOrderDetailsHSK, lso.HUB_Company_HSK AS CompanyHSK,

lso.HUB_Supplier_HSK AS SupplierHSK, lso.HUB_Warehouse_HSK as WarehouseHSK, lso.HUB_SupplierContract_HSK AS SupplierContractHSK, lso.HUB_Responsible_HSK AS ResponsibleHSK,

lsod.HUB_Product_HSK as ProductHSK, sso.OrderDate, ssod.Quantity, ssod.Price, ssod.Summ,

hso.supplOrd_ID as SupplierOrderID, lsod.suppODID as SupplierOrderDetailsID, hp.prod_ID as ProductID

FROM HUB_SupplierOrder hso, LNK_SupplierOrder lso, LNK_SupplierOrder_Details lsod, SAT_SupplierOrder sso, SAT_SupplierOrder_Details ssod, HUB_Product hp

WHERE hp.HUB_Product_HSK=lsod.HUB_Product_HSK AND hso.HUB_SupplierOrder_HSK=sso.HUB_SupplierOrder_HSK AND hso.HUB_SupplierOrder_HSK=lso.HUB_SupplierOrder_HSK AND

lsod.LNK_SupplierOrder_Details_HSK=ssod.LNK_SupplierOrder_Details_HSK AND hso.HUB_SupplierOrder_HSK=lsod.HUB_SupplierOrder_HSK AND

sso.SAT_SupplierOrder_LDTS = (SELECT MAX(sso2.SAT_SupplierOrder_LDTS) FROM SAT_SupplierOrder sso2 WHERE sso.HUB_SupplierOrder_HSK=sso2.HUB_SupplierOrder_HSK) AND

ssod.SAT_SupplierOrder_Details_LDTS = (SELECT MAX(ssod2.SAT_SupplierOrder_Details_LDTS) FROM SAT_SupplierOrder_Details ssod2 WHERE ssod.LNK_SupplierOrder_Details_HSK=ssod2.LNK_SupplierOrder_Details_HSK) AND

lso.LNK_SupplierOrder_LDTS = (SELECT MAX(lso2.LNK_SupplierOrder_LDTS) FROM LNK_SupplierOrder lso2 WHERE lso.HUB_SupplierOrder_HSK=lso2.HUB_SupplierOrder_HSK) AND

lsod.LNK_SupplierOrder_Details_LDTS = (SELECT MAX(lsod2.LNK_SupplierOrder_Details_LDTS) FROM LNK_SupplierOrder_Details lsod2 WHERE lsod.HUB_SupplierOrder_HSK=lsod2.HUB_SupplierOrder_HSK);

CREATE VIEW dimSalesDocs AS SELECT hs.HUB_Sales_HSK AS SalesHSK,

ss.SalesDocNumber,ss.DocumentDate

FROM HUB_Sales hs, SAT_Sales ss

WHERE hs.HUB_Sales_HSK=ss.HUB_Sales_HSK AND

hs.HUB_Sales_HSK=ss.HUB_Sales_HSK AND ss.SAT_Sales_LDTS =

(SELECT MAX(ss2.SAT_Sales_LDTS) FROM SAT_Sales ss2 WHERE ss.HUB_Sales_HSK=ss2.HUB_Sales_HSK);

CREATE VIEW dimCustOrderDocs AS SELECT hc.HUB_CustomerOrder_HSK AS CustomerOrderHSK,

sc.CustomerOrderNumber,sc.OrderDate

FROM HUB_CustomerOrder hc, SAT_CustomerOrder sc

WHERE hc.HUB_CustomerOrder_HSK=sc.HUB_CustomerOrder_HSK AND

hc.HUB_CustomerOrder_HSK=sc.HUB_CustomerOrder_HSK AND sc.SAT_CustomerOrder_LDTS =

(SELECT MAX(sc2.SAT_CustomerOrder_LDTS) FROM SAT_CustomerOrder sc2 WHERE sc.HUB_CustomerOrder_HSK=sc2.HUB_CustomerOrder_HSK);

CREATE VIEW dimSuppOrderDocs AS SELECT hs.HUB_SupplierOrder_HSK AS SupplierOrderHSK,

ss.SupplierOrderNumber,ss.OrderDate

FROM HUB_SupplierOrder hs, SAT_SupplierOrder ss

WHERE hs.HUB_SupplierOrder_HSK=ss.HUB_SupplierOrder_HSK AND

hs.HUB_SupplierOrder_HSK=ss.HUB_SupplierOrder_HSK AND ss.SAT_SupplierOrder_LDTS =

(SELECT MAX(ss2.SAT_SupplierOrder_LDTS) FROM SAT_SupplierOrder ss2 WHERE ss.HUB_SupplierOrder_HSK=ss2.HUB_SupplierOrder_HSK);

ref.by 2006—2025
contextus@mail.ru