Отображение связей "многие-ко-многим" в производных иерархиях (Master Data Services)
Область применения: SQL Server — Только Управляемый экземпляр SQL Azure Windows
Теперь в производных иерархиях (DH) наряду с отображением связей "один-ко-многим" могут отображаться связи "многие-ко-многим".
Связи "многие-ко-многим"
Связь "многие-ко-многим" (M2M) между двумя сущностями можно смоделировать с помощью третьей сущности, обеспечивающей между ними сопоставление.
В приведенном выше примере между сущностями Employee и TrainingClass имеется связь "многие-ко-многим", обеспечиваемая сущностью сопоставления ClassRegistration. Сотрудник может быть зарегистрирован как учащийся на нескольких курсах, и каждый курс может содержать несколько учащихся.
Вы можете создать производную иерархию, отображающую, например учащихся по классу, или включить связь и показать классы, сгруппированные по учащимся.
Примечание.
SQL Server 2016 (13.x) представил производную иерархию для связей M2M. Эта возможность недоступна до этой версии.
Сначала перейдите на страницу управления производными иерархиями и создайте новую производную иерархию:
Затем добавьте уровни в новую производную иерархию, начиная с нижнего края. В этом примере нужно показать учащихся (сотрудников), сгруппированных по учебному курсу. Сущность Employee находится на конечном уровне иерархии и добавляется первой.
Обратите внимание, что на приведенном выше снимке экрана сущность Employee отображается в среднем разделе Текущие уровни как единственный уровень. Предварительная версия производной иерархии справа просто отображает список всех членов сущности Employee. В разделе Доступные уровни слева отображаются уровни, которые можно добавить выше текущего верхнего уровня (Сотрудник). Большинство из них являются атрибутами на основе домена в сущности Сотрудник , включая атрибут на основе домена Отдел .
Начиная с SQL Server, существует новый тип уровня, который моделирует связи M2M, например класс (сопоставленный с помощью ClassRegistration.Student). Имя уровня является более подробным по сравнению с другими именами. Это необходимо для предоставления дополнительных сведений для однозначного описания связи сопоставления. Перетащите этот уровень на уровень Employee в разделе Текущие уровни .
Теперь в области предварительного просмотра отображаются сотрудники, сгруппированные по учебным курсам, для прохождения которых они зарегистрированы. Поскольку это связь "многие-ко-многим", каждый дочерний элемент может иметь несколько родительских элементов. В приведенном выше примере сотрудник 6 {Hillman, Reinout N} зарегистрирован как учащийся двух курсов: 1 {Master Data Services 101} и 4 {Career-Limiting Moves}.
Эта связь сопоставления может отображаться в инвертированном виде с группировкой курсов по учащимся.
Опять же, мы видим, что дочерний элемент может отображаться в нескольких родительских: учебный курс 1 {Master Data Services 101} отображается для 6 {Hillman, Reinout N} и 40 {Ford, Jeffrey L}.
Члены сущности сопоставления ClassRegistration не отображаются нигде в производной иерархии. Они используются для определения связей между родительскими и дочерними элементами в иерархии.
Чтобы изменить связь "многие-ко-многим" путем изменения элементов сущности сопоставления, выполните одно из указанных далее действий. Связь "многие ко многим" доступна только для чтения на странице Обозреватель производных иерархий .
Измените элементы сущности сопоставления на странице Обозреватель сущностей , используя надстройку Master Data Services для Excel или функцию промежуточного хранения данных.
Перетаскивайте дочерние узлы между родительскими на станице Обозреватель производных иерархи.
Этот метод позволяет изменять существующие элементы (если это возможно) и при необходимости добавлять новые элементы. Существующие элементы не удаляются.
Например, при перемещении учащегося на неиспользуемый узел с помощью сущности сопоставления ClassRegistration значение атрибута курса соответствующего элемента сущности сопоставления меняется на NULL и элемент не удаляется. И наоборот, если при перемещении учащегося с неиспользуемого узла в какой-либо курс существует элемент сопоставления, соответствующий учащемуся, где курс имеет значение NULL, этот элемент изменяется путем изменения курса с NULL на новый родительский элемент. Если такой элемент не найден, он добавляется.
Этот процесс позволяет избежать удаление элемента для предотвращения нежелательного удаления других данных пользователей, например, если сущность сопоставления помимо двух атрибутов, определяющих связь "родитель — потомок", содержит другие атрибуты. Пользователи должны выполнять удаления непосредственно в сущности сопоставления.
Новый уровень M2M может отображаться в любой точке производной иерархии, где разрешен уровень атрибута на основе домена . Уровень "многие-ко-многим" может отображаться в верхней части, как в приведенных выше примерах. Он может быть над или под уровнем DBA, включая рекурсивные уровни. Он может находиться под верхним уровнем явной иерархии (устаревшей). Несколько связей M2M можно объединить в одну и ту же производную иерархию.
Уровни M2M могут быть скрытыми, как и другие производные уровни иерархии.
Связь "многие ко многим" в образце модели
Для демонстрации связи M2M просмотрите производную иерархию "Климат региона" в примере модели клиента, которая входит в состав служб Master Data Services.
Как показано на следующем рисунке, имя уровня, которое моделирует эту связь, является Климат (сопоставлено с помощью RegionClimate.Region). В предварительной версии показаны регионы, сгруппированные по типам климата, с которыми они связаны. Это связь "многие ко многим", так как имеются регионы (дочерние элементы), связанные с несколькими типами климата (родительские элементы). Например, APCR {Азиатско-Тихоокеанский регион} связан с A {Tropical} и B {Dry}.
Инструкции по развертыванию модели образца клиента и других примеров моделей, включенных в службы Master Data Services, см. в статье "Развертывание примеров моделей и данных".
Связь "один-ко-многим"
Элемент производной иерархии может быть родителем нескольких дочерних элементов, однако обычно у него не может быть больше одного родительского элемента (исключения см. в разделе Безопасность элементов). Предположим, что имеются две сущности — Employee и Department — и каждый сотрудник принадлежит одному отделу. Эта связь моделируется путем добавления в сущность Employee атрибута DBA, который ссылается на сущность Department.
Это связь "один-ко-многим", так как каждый сотрудник принадлежит только одному отделу, но в каждом отделе может быть несколько сотрудников. Производная иерархия может быть создана, которая отображает сотрудников, группированных по отделу:
Безопасность элементов
Иерархию, допускающую дублирование элементов (элемент может иметь несколько родительских элементов), нельзя использовать для назначения элементам разрешений безопасности. Например:
Рекурсивная производная иерархия (RDH), которая не привязывает рекурсии null (каждый элемент на рекурсивном уровне отображается как в корневом, так и в рекурсивном родительском элементе).
Рекурсивная производная иерархия с уровнем выше рекурсивного уровня (каждый член рекурсивного уровня отображается как под его не рекурсивным родительским, так и с рекурсивным родительским элементом).
Производная иерархия с уровнем M2M (дочерний элемент может быть сопоставлен многим родителям).
Коллекции
Коллекции и явные иерархии устарели. Хранимая процедура преобразования (udpConvertCollectionAndConsolidatedMembersToLeaf) преобразует элементы коллекции в конечные элементы и создает производные иерархии "многие-ко-многим" для записи сведений о принадлежности к коллекции.