Отношения
Применимо к: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium
В табличных моделях связь — это соединение между двумя таблицами данных. Связь определяет, как должны соотноситься данные в двух таблицах. Например, таблица «Customers» и таблица «Orders» могут быть связаны, чтобы отображалось имя клиента, соответствующее каждому заказу.
При импорте из того же источника данных связи, которые уже существуют в таблицах (в источнике данных), которые вы выбрали для импорта, будут повторно созданы в модели. Можно просмотреть связи, которые были автоматически обнаружены и созданы повторно, с помощью конструктора моделей в представлении диаграммы либо с помощью диалогового окна «Управление связями». Можно также вручную создавать новые связи между таблицами при помощи конструктора моделей в представлении диаграмм или при помощи диалоговых окон «Создание связи» или «Управление связями».
После определения связи между заданными таблицами (автоматически, во время импорта или вручную) можно будет выполнять фильтрацию данных с помощью связанных столбцов и выполнять поиск значений в связанных таблицах.
Совет
Если модель содержит много связей, представление диаграммы лучше поможет визуально представить и создавать связи между таблицами.
Преимущества
Связь представляет собой соединение двух таблиц данных на основании одного или нескольких столбцов в каждой таблице. Чтобы понять, чем полезны связи, представим, что отслеживаются данные для заказов клиентов в бизнесе. Можно отслеживать все данные в одной таблице, имеющей структуру, подобную следующей.
CustomerID | Имя | DiscountRate | OrderID | OrderDate | Продукт | Количество | |
---|---|---|---|---|---|---|---|
1 | Эштон | chris.ashton@contoso.com | 0,05 | 256 | 2010-01-07 | Компактный цифровой | 11 |
1 | Эштон | chris.ashton@contoso.com | 0,05 | 255 | 2010-01-03 | Однообъективный зеркальный фотоаппарат | 15 |
2 | Яворски | michal.jaworski@contoso.com | 0,10 | 254 | 2010-01-03 | Недорогая видеокамера | 27 |
Этот подход может быть эффективным, но он подразумевает хранение множества избыточных данных, таких как адрес электронной почты клиента для каждого заказа. Хранение не требует больших затрат, но нужно быть уверенным в том, что при изменении адреса электронной почты будет обновлена каждая строка для этого клиента. Одним из решений этой проблемы является разбиение данных на множество таблиц и определение связей между этими таблицами. Этот подход используется в реляционных базах данных, таких как SQL Server. Например, база данных, которая импортируется в модель, может представлять данные заказов, используя три связанные таблицы.
Клиенты
[CustomerID] | Имя | |
---|---|---|
1 | Эштон | chris.ashton@contoso.com |
2 | Яворски | michal.jaworski@contoso.com |
CustomerDiscounts
[CustomerID] | DiscountRate |
---|---|
1 | 0,05 |
2 | 0,10 |
Orders
[CustomerID] | OrderID | OrderDate | Продукт | Количество |
---|---|---|---|---|
1 | 256 | 2010-01-07 | Компактный цифровой | 11 |
1 | 255 | 2010-01-03 | Однообъективный зеркальный фотоаппарат | 15 |
2 | 254 | 2010-01-03 | Недорогая видеокамера | 27 |
При импорте этих таблиц из одной базы данных импорт может определить связи между таблицами на основе столбцов, которые находятся в [квадратных скобках], и воспроизвести эти связи в конструкторе моделей. Дополнительные сведения см. в разделе Автоматическое обнаружение и вывод связей этой статьи. При импорте таблиц из нескольких источников можно вручную создать связи, как описано в разделе Создание связи между двумя таблицами.
Столбцы и ключи
Связи основаны на столбцах в каждой таблице, содержащих одинаковые данные. Например, таблицы Customers и Orders могут быть связаны друг с другом, поскольку обе содержат столбец, в котором хранится идентификатор клиента. В данном примере имена столбцов одинаковы, но это не является обязательным условием. Один столбец может называться CustomerID, а другой — CustomerNumber, при условии, что все строки в таблице Orders содержат идентификатор, который также хранится в таблице Customers.
В реляционной базе данных имеется несколько типов ключей, которые обычно представлены столбцами со специальными свойствами. Следующие четыре типа ключей могут использоваться в реляционных базах данных:
Первичный ключ: однозначно определяет строку в таблице, например CustomerID в таблице Customers.
Альтернативный ключ (или потенциальный ключ): уникальный столбец, который не является первичным ключом. Например, таблица Employees может хранить идентификатор работника и номер карточки социального страхования, при том что оба они являются уникальными.
Внешний ключ: столбец, который ссылается на уникальный столбец в другой таблице, например CustomerID в таблице Orders, который ссылается на CustomerID в таблице Customers.
Составной ключ— это ключ, состоящий из нескольких столбцов. Составные ключи в табличных моделях не поддерживаются. Дополнительные сведения см. в разделе Составные ключи и столбцы подстановки этой статьи.
В табличных моделях первичный ключ или резервный ключ называется связанным столбцом подстановкиили просто столбцом подстановки. Если таблица имеет и первичный и резервный ключ, в качестве столбца подстановки можно использовать любой из них. Внешний ключ называется исходным столбцом или просто столбцом. В нашем примере связь была бы определена между CustomerID в таблице Orders (столбец) и CustomerID (столбец подстановки) в таблице Customers. Если данные импортируются из реляционной базы данных, по умолчанию конструктор моделей выбирает внешний ключ из одной таблицы и соответствующий первичный ключ из другой таблицы. Однако в качестве столбца подстановки можно использовать любой столбец, имеющий уникальные значения.
Типы связей
Связь между таблицами Customers и Orders является связью один ко многим. Каждый клиент может иметь несколько заказов, но заказ не может иметь несколько клиентов. Другими типами связей являются связи один к одному и многие ко многим. Таблица CustomerDiscounts, которая определяет по одному льготному тарифу для каждого клиента, находится в связи «один к одному» с таблицей Customers. Примером связи "многие ко многим" является прямая связь между таблицами Products и Customers, когда один клиент может купить много продуктов и один продукт может быть куплен несколькими клиентами. Конструктор моделей не поддерживает связи "многие ко многим" в пользовательском интерфейсе. Дополнительные сведения см. в разделе Отношения "многие ко многим" этой статьи.
В следующей таблице представлены связи между тремя таблицами.
Связь | Тип | столбцом подстановки | Столбец |
---|---|---|---|
Customers — CustomerDiscounts | один к одному | Customers.CustomerID | CustomerDiscounts.CustomerID |
Customers — Orders | один ко многим | Customers.CustomerID | Orders.CustomerID |
Связи и производительность
После создания любой связи конструктор моделей, как правило, должен повторно вычислить формулы, использующие столбцы из таблиц, участвующих в созданной связи. Обработка может занять некоторое время, в зависимости от объема данных и сложности связей.
Requirements for relationships
Конструктор моделей предъявляет несколько требований, которые должны учитываться при создании связей.
Одиночная активная связь между таблицами
Наличие нескольких связей может привести к неоднозначной зависимости между таблицами. Для создания точных вычислений необходимо, чтобы от одной таблицы к другой вел единственный путь. Поэтому между каждой парой таблиц может существовать только одна активная связь. Например, в базе данных AdventureWorks DW 2012 содержится таблица DimDate со столбцом DateKey, который связан с тремя различными столбцами из таблицы FactInternetSales: OrderDate, DueDate и ShipDate. Если импортировать эти таблицы без изменений, то первая связь будет создана успешно, однако для последующих связей с участием того же столбца будет получено следующее сообщение об ошибке.
* Связь: table[column 1]-> table[column 2] - Status: error - Причина: невозможно создать связь между таблицами <1> и <таблицей 2>. Между двумя таблицами может существовать только одна прямая или косвенная связь.
Если имеются две таблицы, между которыми существует несколько связей, то необходимо импортировать несколько копий таблицы, содержащей столбец подстановки, и создать между каждой парой таблиц одну связь.
Между таблицами может быть много неактивных связей. Путь для использования между таблицами указывается клиентским средством создания отчетов во время запроса.
Наличие одной связи для каждого исходного столбца
Исходный столбец не может участвовать в нескольких связях. Если вы уже использовали столбец в качестве исходного столбца в одной связи, но его необходимо связать с другим столбцом подстановки в другой таблице, можно создать копию столбца и использовать ее в новой связи.
Создание копии столбца, имеющего те же значения, упрощается посредством применения формулы DAX в вычисляемом столбце. Дополнительные сведения см. в статье Создание вычисляемого столбца.
Применение уникального идентификатора для каждой таблицы
Каждая таблица должна иметь один столбец, который однозначно идентифицирует каждую строку в этой таблице. Такой столбец часто именуется первичным ключом.
Уникальные столбцы подстановки
Значения данных в столбце подстановки должны быть уникальными. Иными словами, столбец не может содержать повторяющиеся значения. В табличных моделях значения NULL и пустые строки считаются эквивалентными пустому значению, которое является отдельным значением данных. Это значит, что столбец подстановки не может содержать несколько значений NULL.
Совместимые типы данных
Типы данных в исходном столбце и в столбце подстановки должны быть совместимыми. Дополнительные сведения о типах данных см. в разделе Поддерживаемые типы данных.
Составные ключи и столбцы подстановки
Составные ключи нельзя использовать в табличной модели. Необходимо иметь только один столбец, однозначно определяющий каждую строку в таблице. При попытке импортировать таблицы с существующей связью на основе составного ключа импорт будет игнорировать эту связь, так как ее невозможно создать в табличной модели.
Если нужно создать связь между двумя таблицами в конструкторе моделей, а первичный и внешний ключи определяются несколькими столбцами, то перед созданием связи необходимо объединить значения, чтобы создать один ключевой столбец. Это можно сделать перед импортом данных или осуществить в конструкторе моделей, создав вычисляемый столбец.
Связи "много ко многим".
Табличные модели на уровне совместимости 1500 и выше, развернутые в Azure Analysis Services, SQL Server analysis Services 2019 и более поздних версий, а Power BI Premium поддерживают связи "многие ко многим".
Связи "многие ко многим" — это связи между таблицами, где оба столбца не являются уникальными. Связь можно определить между измерением и таблицей фактов со степенью детализации выше, чем ключевой столбец измерения. Это избавляет от необходимости нормализовать таблицы измерений и повышает удобство работы для пользователей, так как итоговая модель содержит меньше таблиц, а столбцы в них логически сгруппированы.
Создавайте связи "многие ко многим" с помощью Visual Studio 2019 с проектами служб Analysis Services, API табличной объектной модели (TOM), языка скриптов табличных моделей (TMSL) и средства табличного редактора с открытым кодом.
Табличные модели на уровнях совместимости 1400 и более низких не поддерживают связи "многие ко многим", и вы не можете добавить таблицы соединения в конструктор моделей. Тем не менее можно использовать функции DAX для моделирования связи «многие ко многим». Кроме того, такого же результата можно достичь посредством настройки двунаправленного кросс-фильтра. Иногда требование связи "многие ко многим" может быть удовлетворено с помощью перекрестных фильтров, которые сохраняют контекст фильтра в нескольких связях таблиц. Дополнительные сведения см. в разделе Двунаправленные кроссфильтры в табличных моделях .
Самосоединения и циклы
В таблицах табличной модели не допускаются самосоединения. Самосоединение — это рекурсивная связь таблицы с самой собой. Самосоединения часто используются для определения иерархий типа «родители-потомки». Например, можно соединить таблицу Employees с самой собой, чтобы сформировать иерархию, которая показывает цепочку подчиненности на предприятии.
Конструктор моделей не позволяет создавать циклы между связями в модели. Иными словами, следующий набор связей запрещается.
Таблица 1, столбец a в таблицу 2, столбец f
Таблица 2, столбец f в таблицу 3, столбец n
Таблица 3, столбец n в таблицу 1, столбец a
При попытке создания такой связи, которая приведет к образованию цикла, выдается ошибка.
Inference of relationships
В некоторых случаях связи между таблицами автоматически объединяются в цепочки. Например, если создать связь между первыми двумя наборами таблиц, указанных ниже, то определяется наличие связи между другими двумя таблицами и эта связь устанавливается автоматически.
Products и Category — связь создается вручную
Category и SubCategory — связь создается вручную
Products и SubCategory — связь определяется автоматически
Для автоматического объединения связей в цепочки эти связи должны идти в одном направлении, как показано выше. Если исходные связи были установлены, например между таблицами Sales и Products, а также между Sales и Customers, то связь не выводится. Это вызвано тем, что связь между таблицами Products и Customer является связью «многие ко многим».
Detection of relationships when importing data
При импорте из реляционной таблицы источника данных между таблицами обнаруживаются существующие связи на основе данных исходной схемы. При импорте связанных таблиц эти связи будут реплицированы в модели.
Manually create relationships
Хотя большинство связей между таблицами в едином реляционном источнике данных обнаруживаются автоматически и создаются в табличной модели, во многих случаях необходимо создать связи между таблицами модели вручную.
Если модель содержит данные из нескольких источников, то, вероятно, придется создавать связи вручную. Например, можно импортировать таблицы Customers, CustomerDiscounts и Orders из реляционного источника данных. Связи, существующие между этими таблицами в источнике, будут автоматически созданы в модели. Затем можно добавить другую таблицу из другого источника, например региональные данные из таблицы Geography в книге Microsoft Excel. Затем можно вручную создать связь между столбцом таблицы Customers и столбцом таблицы Geography.
Чтобы вручную создавать новые связи в табличной модели, можно воспользоваться конструктором моделей в представлении диаграмм либо диалоговым окном «Управление связями». В представлении диаграммы графически отображаются таблицы и связи между ними. Связь можно легко создать, щелкнув столбец в одной таблице и перетащив курсор в другую таблицу. Между таблицами будет создана связь в правильном порядке. Связи между таблицами отображаются в диалоговом окне «Управление связями» в простом табличном формате. Сведения о создании связей вручную см. в статье Создание связи между двумя таблицами.
Duplicate values and other errors
Если выбрать столбец, который нельзя использовать в связи, рядом с ним появится красный значок X. Если навести курсор мыши на значок ошибки, можно просмотреть сообщение с подробными сведениями о проблеме. Следующие проблемы могут сделать невозможным создание связи между выбранными столбцами.
Проблема или сообщение | Решение |
---|---|
Связь не удается создать, поскольку оба выбранных столбца содержат повторяющиеся значения. | Для создания допустимой связи необходимо, чтобы хотя бы один столбец в паре содержал только уникальные значения. Можно изменить столбцы, чтобы удалить повторяющиеся значения, или изменить порядок столбцов на обратный, чтобы столбец, содержащий уникальные значения, использовался как Связанный столбец уточняющих запросов. |
Столбец содержит пустое значение или значение NULL. | Столбцы данных не могут соединяться по значению NULL. Для каждой строки должно быть значение в обоих столбцах, используемых в связи. |
См. также раздел
Статья | Описание |
---|---|
Создание связи между двумя таблицами | Содержит описание того, как вручную создать связь между двумя таблицами. |
Удаление связей | Содержит описание того, как удалить связь, а также последствий удаления отношений. |
Двунаправленные кросс-фильтры | Содержит описание двунаправленной кросс-фильтрации для связанных таблиц. Если таблицы связаны и определены двунаправленные кросс-фильтры, контекст фильтра одной связи таблиц можно использовать для запросов ко второй связи таблиц. |