Язык Многомерных Выражений (Multidimensional Expressions, MDX)

Язык MDX был впервые представлен как составляющая OLE DB for OLAP в 1997г. компанией Microsoft.

Несмотря на то, что MDX является не общим стандартом, а только внутренней спецификацией Microsoft, он был принят многими ведущими распространителями технологии OLAP. В их числе разработчики серверных приложений, такие, как Applix, Microstrategy, SAS, SAP, Whitelight, NCR, а также разработчики клиентских приложений: Panorama Software, Proclarity, AppSource, Cognos, Business Objects, Brio Technology, и другие.

С появлением XML for Analysis, в котором MDX был принят как стандартный язык запросов, все большее число компаний (в их числе, например, Hyperion Solutions), стали поддерживать MDX. XML for Analysis обращается к OLE DB for OLAP с помощью языка запросов MDX.

Основные объекты многомерных баз данных

Основные элементы структуры многомерных баз данных – Кубы (Cubes), Измерения (Dimensions) и Меры (Measures).

Куб (Cube) — совокупность данных, имеющая многомерную структуру. Куб представлен набором мер и измерений. Измерений может быть много.

Рассмотрим эти понятия на примере базы данных клиентов.

Пусть наш куб содержит данные клиентов: ФИО, дату рождения, место рождения, пол, место жительства, а также календарь и список населенных пунктов. В случае реляционной базы данных можно было организовать 3 таблицы: [Населенные пункты], [Календарь] и [Паспортные данные]. В многомерном случае можно задать, например, такие измерения: [Клиенты], [Дата], [Место], [Тип места] (рождения или жительства), [Пол]. На пересечении этих измерений зададим некоторые агрегированные величины – меры. Например: [Количество клиентов], [Максимальный возраст].

Пример (*): Сколько клиентов мужского пола проживает в Твери? Ответ можно получить, задав следующий MDX-запрос:

SELECT { [Место].[РФ].[Тверь] } ON COLUMNS,

{ [Пол].[М] } ON ROWS FROM [Наш куб данных]

WHERE ([Measures].[Количество клиентов], [Тип места].[Место жительства])

В данном запросе присутствуют 3 измерения: [Место], [Тип места] и [Пол]; все измерения, не указанные в запросе ([Клиенты] и [Дата]), присутствуют в нем неявно.

Совокупность мер является, по сути, еще одним измерением.

Синтаксис MDS очень похож на синтаксис SQL.

Члены измерений (Members).

В рассмотренном выше примере мы пользовались измерением [Место], детализируя его с помощью заданной на нем иерархии. Делается это с помощью членов измерения, т.е. единиц описания на различных уровнях иерархии.

Примеры членов измерения: [РФ], [Белоруссия], [Минск], [ул. Северная], [дом №70], [дом №95] и т.д До каждого члена можно «добраться», описав путь к нему по иерархической структуре. Наример: [Место]. [Иерархия_Место].[РФ].[Тверь]. [Петербургское шоссе].[дом №777].[квартира №8888],

[Место]. [Иерархия_Место].[РФ].[Москва]

Кортежи (Tuples) и множества (Sets)

Кортеж — это набор членов одного или нескольких разных измерений. Задавая кортеж, мы указываем на конкретную ячейку или набор ячеек внутри куба. Таким образом, кортеж – это декартово произведение (т.е. пересечение) множеств, определенных на различных измерениях куба.

Кортежи задаются с помощью круглых скобок.

Примеры: ([Место].[РФ].[Рязань].[улица Есенина], [Пол].[Ж], [Тип места].[Место жительства]) – все дамы с улицы Есенина в Рязани;

В языке MDX пересечения множеств реализуются с помощью конструкций CrossJoin <Кортеж>, Where <Кортеж> и других, что обусловлено необходимостью представить результат в удобном для восприятия виде.

Множество (или Набор) — это совокупность (объединение) кортежей, определенных с использованием одинакового количества одних и тех же измерений.

Примеры:

{ [Дата].[1960].[Январь], [Дата].[1960].[Февраль] } – все клиенты, родившиеся в январе или в феврале 1960г.

Множество заключается в фигурные скобки.

Пересечение кортежа или множества с какой-либо мерой дает значение меры на данном множестве. В первом разобранном нами примере (*) мы имели пересечение кортежа ([Место].[РФ].[Тверь], [Пол].[М]) с мерой [Measures].[Количество клиентов].

Член по умолчанию (default member)

В большинстве случаев в кортежах явно присутствуют не все измерения. Чтобы получить значение меры на кортеже, нужно учесть все прочие измерения. Для этого у каждого измерения существует член по умолчанию. Как правило, в роли Default Member выступает единственный член специального уровня иерархии [All], автоматически создаваемого при создании измерения. Этот уровень содержит совокупные результаты по всему измерению.

Пример: ([Клиенты].[All].Members, [Measures].[Максимальный возраст]) – этот кортеж возвращает возраст самого старшего клиента.

Эквивалентное указание на член по умолчанию можно записать короче и корректнее с помощью выражения DefaultMember: [Клиенты].DefaultMember.

Если уровень [All] отсутствует, в его роли выступает первый член следующего уровня. В некоторых системах членом по умолчанию можно назначить любой член или MDX-выражение измерения. Поскольку совокупность мер ([Measures]) тоже является одним из измерений, то и среди мер есть элемент по умолчанию. Предположим, что в нашем случае мерой по умолчанию является [Количество клиентов]. Тогда, если из нашего запроса (*) удалить конструкцию WHERE ([Measures].[Количество клиентов]), результат его выполнения останется прежним.

Функции навигации

Members, AllMembers Members применяется к иерархиям или к уровням.

PrevMember, NextMember Для перемещения в пределах одного уровня, используются функции PrevMember и NextMember:

Children, Parent Для перемещения вверх и вниз по уровням используются функции Children и Parent: Функции FirstChild, LastChild возвращают первого (последнего) потомка данного элемента.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: