Поделиться через


Связи (табличные службы SSAS)

В табличных моделях связь — это соединение между двумя таблицами данных. Связь определяет, как должны соотноситься данные в двух таблицах. Например, таблица Customers и таблица Orders могут быть связаны для отображения имени клиента, соответствующего каждому заказу.

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

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

СоветСовет

Если модель содержит много связей, представление диаграммы лучше поможет визуально представить и создавать связи между таблицами.

Разделы данной темы:

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

  • Требования к связям

  • Вывод связей

  • Определение существующих связей при импорте данных

  • Создание связей вручную

  • Повторяющиеся значения и другие ошибки

  • Связанные задачи

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

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

CustomerID

Название

EMail

DiscountRate

OrderID

OrderDate

Товар

Количество

1

Эштон

chris.ashton@contoso.com

.05

256

2010-01-07

Компактный цифровой

11

1

Эштон

chris.ashton@contoso.com

.05

255

2010-01-03

Однообъективный зеркальный фотоаппарат

15

2

Яворски

michal.jaworski@contoso.com

.10

254

2010-01-03

Недорогая видеокамера

27

Этот подход может быть эффективным, но он подразумевает хранение множества избыточных данных, таких как адрес электронной почты клиента для каждого заказа. Хранение не требует больших затрат, но нужно быть уверенным в том, что при изменении адреса электронной почты будет обновлена каждая строка для этого клиента. Одним из решений этой проблемы является разбиение данных на множество таблиц и определение связей между этими таблицами. Именно этот подход используется в реляционных базах данных наподобие SQL Server. Например, база данных, которая импортируется в модель, может представлять данные заказов, используя три связанные таблицы.

Заказчики

[CustomerID]

Название

Email

1

Эштон

chris.ashton@contoso.com

2

Яворски

michal.jaworski@contoso.com

CustomerDiscounts

[CustomerID]

DiscountRate

1

.05

2

.10

Orders

[CustomerID]

OrderID

OrderDate

Товар

Количество

1

256

2010-01-07

Компактный цифровой

11

1

255

2010-01-03

Однообъективный зеркальный фотоаппарат

15

2

254

2010-01-03

Недорогая видеокамера

27

При импорте этих таблиц из одной и той же базы данных мастер импорта таблиц может обнаружить связи между таблицами, основанные на столбцах, заключенных в [квадратные скобки], и воспроизвести эти связи в конструкторе моделей. Дополнительные сведения см. в подразделе Автоматическое обнаружение и вывод связей этого раздела. Если таблицы импортируются из нескольких источников, то связи можно создавать вручную, как описано в Создание связи между двумя таблицами (табличные службы SSAS).

Столбцы и ключи

Связи основаны на столбцах в каждой таблице, содержащих одинаковые данные. Например, таблицы 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

Связи и производительность

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

Требования к связям

Конструктор моделей предъявляет несколько требований, которые должны учитываться при создании связей.

Одиночная активная связь между таблицами

Наличие нескольких связей может привести к неоднозначной зависимости между таблицами. Для создания точных вычислений необходимо, чтобы от одной таблицы к другой вел единственный путь. Поэтому между каждой парой таблиц может существовать только одна активная связь. Например, в базе данных AdventureWorks DW 2012 содержится таблица DimDate со столбцом DateKey, который связан с тремя различными столбцами из таблицы FactInternetSales: OrderDate, DueDate и ShipDate. Если импортировать эти таблицы без изменений, то первая связь будет создана успешно, однако для последующих связей с участием того же столбца будет получено следующее сообщение об ошибке.

* Связь: таблица[столбец 1]-> таблица[столбец 2] — состояние: ошибка — причина: Не удается создать связь между таблицами <таблица 1> и <таблица 2>. Между двумя таблицами может существовать только одна прямая или косвенная связь.

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

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

Наличие одной связи для каждого исходного столбца

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

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

Применение уникального идентификатора для каждой таблицы

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

Уникальные столбцы подстановки

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

Совместимые типы данных

Типы данных в исходном столбце и в столбце подстановки должны быть совместимыми. Дополнительные сведения о типах данных см. в разделе Поддерживаемые типы данных (табличные службы SSAS).

Составные ключи и столбцы подстановки

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

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

Связи «многие ко многим»

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

Самосоединения и циклы

В таблицах табличной модели не допускаются самосоединения. Самосоединение — это рекурсивная связь таблицы с самой собой. Самосоединения часто используются для определения иерархий типа «родители-потомки». Например, можно соединить таблицу Employees с самой собой, чтобы сформировать иерархию, которая показывает цепочку подчиненности на предприятии.

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

От таблицы 1, столбец a   к   таблице 2, столбец f

От таблицы 2, столбец f   к   таблице 3, столбец n

От таблицы 3, столбец n   к   таблице 1, столбец a

При попытке создания такой связи, которая приведет к образованию цикла, выдается ошибка.

Вывод связей

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

Связь между таблицами Products и Category создается вручную.

Связь между таблицами Category и SubCategory создается вручную.

Связь между таблицами Products и SubCategory определяется автоматически.

Для автоматического объединения связей в цепочки эти связи должны идти в одном направлении, как показано выше. Если исходные связи были установлены, например между таблицами Sales и Products, а также между Sales и Customers, то связь не выводится. Это вызвано тем, что связь между Products и Customers является связью «многие ко многим».

Определение существующих связей при импорте данных

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

Создание связей вручную

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

Если модель содержит данные из нескольких источников, то, вероятно, придется создавать связи вручную. Например, можно импортировать таблицы Customers, CustomerDiscounts и Orders из реляционного источника данных. Связи, существующие между этими таблицами в источнике, будут автоматически созданы в модели. Затем можно добавить другую таблицу из другого источника, например региональные данные из таблицы Geography в книге Microsoft Excel. Затем можно вручную создать связь между столбцом таблицы Customers и столбцом таблицы Geography.

Чтобы вручную создавать новые связи в табличной модели, можно воспользоваться конструктором моделей в представлении диаграмм либо диалоговым окном «Управление связями». В представлении диаграммы графически отображаются таблицы и связи между ними. Связь можно легко создать, щелкнув столбец в одной таблице и перетащив курсор в другую таблицу. Между таблицами будет создана связь в правильном порядке. Связи между таблицами отображаются в диалоговом окне «Управление связями» в простом табличном формате. Чтобы узнать, как создавать связи вручную, см. раздел Создание связи между двумя таблицами (табличные службы SSAS).

Повторяющиеся значения и другие ошибки

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

Проблема или сообщение

Решение

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

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

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

Столбец содержит пустое значение или значение NULL.

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

Связанные задачи

Раздел

Описание

Создание связи между двумя таблицами (табличные службы SSAS)

Содержит описание того, как вручную создать связь между двумя таблицами.

Удаление связей (табличные службы SSAS)

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

См. также

Основные понятия

Таблицы и столбцы (табличные службы SSAS)

Импорт данных (табличные службы SSAS)