АНАЛИТИКА ПЛЮС
Профессиональные услуги в сфере BI

Новая модель данных (Data Model) Tableau 2020.2

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

Предыдущая модель данных

При использовании предыдущей модели данных (до версии Tableau 2020.2), мы выбирали таблицы, а также указывали тип объединения, как именно объединить выбранные таблицы.

Например, вот простая модель данных, которая объединяет таблицы Order и People на основе поля Region.

Новая модель данных (Data Model) Tableau 2020.2, изображение №1

Давайте посмотрим на SQL, который при этом выполняется:

SELECT *
FROM [Orders]
INNER JOIN [People]
ON [Orders].[Region] = [People].[Region]

Любые визуализации, которые мы создаем в Tableau при объединении таблиц Order и People, всегда будут использовать этот базовый SQL, даже если мы не включаем поля из таблицы People .

Например, давайте создадим очень простую гистограмму, которая показывает объем продаж по клиентам. Это сгенерирует следующий SQL:

SELECT [Customer Name], SUM([Sales])
FROM [Orders]
INNER JOIN [People]
ON [Orders].[Region] = [People].[Region]
GROUP BY [Customer Name]

Два поля , которые используются в нашей визуализации, а именно Customer Name и Sales берутся из таблицы Order, то есть мы не используем поля из таблицы People. Тем не менее, SQL, сгенерированный Tableau, все еще включает соединение с таблицей People.

Этот подход имеет несколько недостатков.

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

Во-вторых мы можем получить больше записей, чем нам действительно нужно. Чтобы продемонстрировать это, давайте рассмотрим вариант, в котором между нашими таблицами существует отношение «один ко многим» (one-to-many). Ниже, приведена альтернативная таблица данных Person с именем Person_Multiple :

Новая модель данных (Data Model) Tableau 2020.2, изображение №2

Видно, что в этой таблице в каждом регионе есть два человека. Если использовать эту таблицу в нашей модели данных, то для нее будет выполнятся SQL, аналогичный описанному выше. Но так как в каждом регионе есть два человека, каждая запись в таблице Order будет дублироваться. Итак, мы получим 19 988 записей вместо 9 994 записей, которые находятся в таблице Order. А если речь идет о миллионных записях, можно представить к чему это может привести. Но эта разница в объеме данных является лишь частью проблемы — дублирование данных также влияет на агрегации.

Например, давайте снова создадим гистограмму, показывающую объемы продаж по клиентам. Выполняется почти тот же SQL (за исключением использования People_Multiple вместо People), но из-за дублирования записей наши итоговые агрегаты продаж удваиваются. Самым типичным решением этой проблемы является использование вычислений LOD (Level-of-Detail). К сожалению, вычисления LOD немного сложны и не всегда доступны для новых пользователей Tableau. Кроме того, некоторые пользователи могут даже не осознавать, что их объединение привело к дублированию данных, и, следовательно, они не знают, что им нужно решать эту проблему.

Примечание: есть другой способ решения проблемы дублирования записей- параметр «Assume Referential Integrity». Когда вы используете этот параметр, Tableau автоматически включает объединенную таблицу в запрос, только если на нее специально ссылаются поля в вашей визуализации. Это, конечно, приведет к более эффективному SQL. Но нужно также быть осторожными — если вы выберете эту функцию, но ваша база данных не будет иметь «ссылочной целостности», это может привести к неточным результатам.

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

1) Слишком сложный SQL — ненужное чрезмерное усложнение нашего SQL, которое влияет на производительность.

2) Дублированные записи — больше записей, чем нам нужно.

3) Потребность в вычислении LOD — необходимость использовать вычисления LOD для устранения дублирования данных в агрегатах.

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

Новая модель данных

Давайте рассмотрим новую модель данных в новой версии Tableau 2020.2. Использование «связей» (Relationships) означает, что Tableau будет генерировать уникальный SQL для каждого создаваемого вами представления (визуализации), который больше не будет включать все таблицы в вашей модели данных. Вместо этого он анализирует поля, которые используются в вашем представлении, и создает SQL, предназначенный для получения только тех данных, которые вам действительно нужны.

Ниже приведена модель данных с использованием «связей». Обратите внимание, что нет диаграммы Венна, которая показывает тип объединения. Это из-за того, что нам больше не нужно указывать тип объединения. Мы просто определяем связь между двумя таблицами. Но на данный момент эти таблицы остаются независимыми. Tableau не создает базовый SQL для использования в рабочей книге, как в старой модели данных. Мы просто устанавливаем связь между таблицами, которые будут использоваться.

Новая модель данных (Data Model) Tableau 2020.2, изображение №3

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

SELECT [Customer Name], SUM([Sales])
FROM [Orders]
GROUP BY [Customer Name]

Tableau автоматически определяет, что ни одно из полей People не используется в этом представлении, и поэтому исключил его из SQL. Это понятие, которое в Tableau называется «join culling» — в основном процесс, с помощью которого механизм обработки данных удаляет ненужные объединения.

Но что произойдет, если мы будем использовать поле из таблицы People в нашем представлении? Например, что если мы отразим записи только для Anna Andreadi (таблица People, поле Person)? Это сгенерирует следующий SQL:

SELECT [Customer Name], SUM([Sales])
FROM [Orders]
INNER JOIN [People]
ON [Orders].[Region] = [People].[Region]
WHERE [Person] = 'Anna Andreadi'
GROUP BY [Customer Name]

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

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

Но как новая модель данных влияет на наши две другие проблемы — дублирование записей и потребность в вычислении LOD, — которые вызваны отношением «один ко многим» (one-to-many)?

Предыдущая модель данных объединяет таблицы, а только потом сохраняет данные, в новой модели данные таблиц хранятся вне зависимости от объединения. Таким образом, дублирование данных не является проблемой с точки зрения объема данных. Но это может быть проблемой, когда дело доходит до агрегации. Чтобы понять это, давайте изменим нашу модель данных, для этого будем использовать таблицу People_Multiple вместо People :

Новая модель данных (Data Model) Tableau 2020.2, изображение №4

Теперь давайте снова построим нашу простую гистограмму объем продаж по клиентам. Когда мы сделаем это, наш SQL будет выглядеть так:

SELECT [Customer Name], SUM([Sales])
FROM [Orders]
GROUP BY [Customer Name]

Итак, поскольку представление не содержит никаких полей из таблицы People_Multiple , Tableau автоматически отбирает соединения. И преимущество этого простого SQL в том, что SUM (Sales) не будет дублироваться и это даст нам фактическое значение без необходимости вычисления LOD.

Но что произойдет при использовании поля из таблицы People_Multiple? Добавим фильтр на Person = ‘Central Person 1’. Наш SQL при этом будет выглядеть так:

SELECT [Customer Name], SUM([Sales])
FROM [Orders]
INNER JOIN (
SELECT [Orders].[Region]
FROM [Orders]
INNER JOIN [People_Multiple]
ON [Orders].[Region] = [People_Multiple].[Region]
WHERE [Person] = 'Central Person 1'
GROUP BY [Orders].[Region]
) AS [Table 1]
ON [Orders].[Region] = [Table 1].[Region]
GROUP BY [Customer Name]

Видно, что этот запрос немного сложнее, чем любой, который мы рассматривали выше. Tableau автоматически определил, что в нашей таблице есть отношение «один ко многим» (one-to-many), поэтому Tableau избегает прямого соединения между таблицами Orders и People_Multiple, так как это может привести к дублированию записей. Вместо этого Tableau генерирует следующий подзапрос:

SELECT [Orders].[Region]
FROM [Orders]
INNER JOIN [People_Multiple]
ON [Orders].[Region] = [People_Multiple].[Region]
WHERE [Person] = 'Central Person 1'
GROUP BY [Orders].[Region]

Этот запрос объединяет Orders и People_Multiple, избирая только поле Region — поле, на котором строятся наши связи с таблицами. Результатом этого конкретного SQL является один столбец и строка:

Новая модель данных (Data Model) Tableau 2020.2, изображение №5

Затем он присоединяет это обратно к таблице Orders и подводит итоги продаж. Поскольку SQL избегает непосредственного объединения двух таблиц, мы не получаем дублирования данных, и агрегация имеет точное значение без необходимости выполнять сложные вычисления LOD.

Вывод: мы рассмотрели новую модель данных,и очень надеемся, что теперь вы лучше понимаете, как она работает , а также чем она отличается от предыдущей модели данных и какие проблемы решает. Таким образом новая модель данных устраняет ряд общих проблем, в том числе проблему, которая возникает при работе с отношениями «один-ко-многим» (one-to-many).

Источник: https://www.flerlagetwins.com/

x

Этот сайт использует файлы cookies, чтобы облегчить вам пользование нашим веб-сайтом.

Продолжая использовать этот веб-сайт, вы даете согласие на использование файлов cookies.