Доступно с лицензией Standard или Advanced.
Классы отношений
Классы отношений (relationship classes) позволяют вам отслеживать связи между объектами в вашей базе геоданных. Эти отношения могут быть простыми или сложными. Сложные отношения подразумевают отношения между родительским и дочерним объектами или композицией, а также обладают поведением, которое выражается во влиянии изменений объектов с одной стороны отношения на объекты с другой стороны отношения. Объектно-связанные аннотации в базе геоданных используют сложные отношения.
Отношения в классе отношений могут храниться с использованием первичного и внешнего ключей в классах объектов с любой стороны класса отношений. В случае отношения многие ко многим (M к N) и атрибутированных классов отношений, эти классы отношений хранятся в виде отдельной таблицы.
Вы можете использовать окно Атрибуты или таблицу для поиска всех объектов, которые связаны с выбранным объектом. Когда вы нашли связанный объект, вы можете редактировать его атрибуты. Также вы можете использовать инструмент редактирования в ArcMap, чтобы прекратить отношение между любыми двумя объектами или создать новые отношения. При таком способе редактировании объектов и отношений, вся целостность на уровне ссылок сохраняется.
Добавление и удаление отношений
Вы можете использовать окно Атрибуты, чтобы создавать и удалять отношения между двумя объектами. Если отношения контролируются с помощью первичного (primary) и вторичного (foreign) ключей (неатрибутированные отношения один к одному – 1-1 и один ко многим – 1-M), вторичный ключ в объекте-адресате заполняется значениями первичного ключа в объекте-источнике. Если отношение между двумя объектами удаляется, то значение внешнего ключа в объекте-адресате заменяется нулевыми значениями. У внешнего ключа объекта-адресата должны быть поля, допускающие нулевые значения.
![Создание и удаление отношений (ключи) Создание и удаление отношений (ключи)](GUID-AC0DF115-2CE7-4F94-9BC9-55F8E94FBFD4-web.gif)
Если класс отношений представляет отношение многие ко многим (M–N) или отношение с атрибутами, то они хранятся в отдельной таблице базы геоданных. При создании нового отношения между объектами в классе отношений такого типа, к таблице добавляется новая строка. Эта строка заполняется значениями из первичных ключей объекта-источника и адресата. Если отношение между двумя объектами будет удалено, то строка, относящаяся к этому отношению будет удалена из таблицы отношения.
![Создание или удаление отношений (M к N и по атрибутам) Создание или удаление отношений (M к N и по атрибутам)](GUID-942338DE-3FFC-46C1-98D7-3D05BE72697A-web.gif)
Редактирование объектов в простом классе отношений
Когда объект, который участвует в отношениях с другими объектами, удаляется из базы геоданных, то все отношения также удаляются. Если объект, который был удален, является объектом-источником, то вторичный ключ во всех объектах-адресатах, которые связаны с источником устанавливается равным нулевому значению – null. Если удаленный объект являлся объектом-адресатом, то объект-источник не изменяется.
Если отношения хранятся в виде строк в таблице (отношения многие ко многим M – N атрибутированные или нет), тогда при удалении адресата или объекта-источника происходит удаление строк таблицы, соответствующих отношениям между удаленными объектами.
![Удаление связанных объектов Удаление связанных объектов](GUID-A82AA261-4239-4098-AC91-1BA0536B9A64-web.gif)
Создание новых связанных объектов
В ArcMap вы можете выбрать объект, затем обратиться к диалоговому окну Атрибуты, чтобы создать новый непространственный объект в связанном классе. Когда этот новый связанный объект создан, все его атрибуты заполняются допустимыми значениями по умолчанию и устанавливается отношение с объектом, из которого оно было создано. Таким способом вы можете создать только непространственный объект; пространственные объекты так не создаются.
Если отношения хранятся с помощью первичного и вторичного ключа, вторичный ключ в объекте-адресате заполняется значениями первичного ключа объекта-источника, вне зависимости от того, были ли объект-источник и объект-адресат созданы с помощью диалогового окна Атрибуты. Если отношения хранятся в виде строк в таблице отношений (отношения многие ко многим M-N, атрибутированные отношения), новая строка добавляется в таблицу класса отношений.
Следующие таблицы показывают, что когда вы используете окно Атрибуты для создания новых связанных объектов, отношение создается с объектом на основе которого оно было создано. Если отношения хранятся с помощью первичного и вторичного ключей, вторичный ключ заполняется с помощью первичного ключа объекта-источника.
![Создание новых связанных объектов Создание новых связанных объектов](GUID-1E3DFA87-9AB9-4DA6-A17B-746E75DAA5A2-web.gif)
Редактирование объектов в сложном классе отношений
Сложные отношения включают специальное поведение. При редактировании объектов, участвующих в сложном отношении, это поведение переносится на процесс редактирования. Правки, внесенные в объект-источник сложного отношения, очень часто непосредственно влияют на связанный с ним объект-адресат. Это поведение частично зависит от режима сообщений в классе отношений.
По умолчанию класс сложного отношения имеет прямое сообщение – таким образом, когда объект в сложном отношении редактируется, он отправляет сообщение к связанным объектам-адресатам. Связанные объекты отвечают на сообщение стандартным образом: если объекты-адресаты не являются пространственными объектами, они не меняются. Однако, если объекты-адресаты являются пространственными объектами, они будут перемещены на то же расстояние или повернуты на тот же угол, что и источники. Редактирование отдельных вершин пространственного объекта считается обновлением, но не перемещением геометрии пространственных объектов. В таком случае связанные объекты перемещены не будут. В таком случае связанные объекты перемещены не будут.
В этом примере, выбранная синяя опора является объектом-источником, а зеленый трансформатор – объектом-адресатом.
![Сложное отношение между опорой и трансформатором Сложное отношение между опорой и трансформатором](GUID-E087FF6D-0328-4811-A2D5-08FE2D0E46D7-web.gif)
Как и в случае простых отношений, сложные отношения также поддерживают целостность на уровне ссылок при удалении объектов, но реализуется это по-другому. Когда объект-источник в сложном отношении удаляется, все объекты, связанные с ним через это отношение, также удаляются. Это каскадное удаление произойдет в любом случае, независимо от того, посылаются сообщения в прямом, обратном, обоих направлениях или не посылаются совсем.
Набор таблиц ниже демонстрирует, что когда объект-источник в сложном отношении удаляется, все объекты-адресаты связанные через сложное отношение будут также удалены.
![Удаление объектов-источников в сложном отношении Удаление объектов-источников в сложном отношении](GUID-DE1CF818-7D42-44FB-8CD2-569CA6C93938-web.gif)
Когда объект-адресат удален, то удаляется связь между ним и объектом-источником, но сам объект-источник не удаляется и не изменяется.
В случае с объектно-связанными аннотациями, связь между каждым фрагментом аннотации и соответствующим пространственным объектом моделируется как сложное отношение. Родительский (оригинальный) объект в отношении – это обычный объект, а дочерний (целевой) объект – это связанная с ним аннотация.
Если у вас есть отношения многие-к-многим, которые моделируются с помощью таблицы Присоединить (Join table) вы можете использовать инструмент геообработки Таблица в класс отношений (Table To Relationship Class) для преобразования таблицы, которая связывает значения из двух других таблиц в класс отношений с атрибутами.
Можете добавить атрибутированный класс отношений как таблицу в ArcMap. Уже в ArcMap эту таблицу можно открыть и редактировать точно так же, как и любую другую таблицу. Однако вы не можете редактировать поля вторичного ключа и добавлять новые строки, если не будете пользоваться редактором атрибутов.
Разбиение пространственных объектов, участвующих в отношениях
Разбиение одного пространственного объекта, хранящегося в базе геоданных на два отдельных объекта сохранит оригинальный объект (но изменит его геометрию), а также создаст один новый объект. Когда объект разбивается, то для большей его части сохраняется прежний ObjectID оригинального объекта, а для меньшей части создается новый пространственный объект. В случае, когда объект делится поровну, то та часть, в которой расположена начальная точка, сохранится в качества оригинального объекта (сохранит ObjectID), а вторая часть станет новым объектом. Это имеет применение, когда объект, который разбивают на части, имеет отношения с другими объектами в базе геоданных.
В случае простых отношений, когда вы разбиваете объект-источник, отношения между ним и объектами-адресатами удаляются. Когда новые объекты создаются в результате операции разбиения, оба объекта будут обладать одинаковым первичным ключом, и таким образом, оба останутся связанными с объектами-адресатами.
В случае сложных отношений поведение будет другим. Если разбивается участвующий в сложном отношении исходный пространственный объект, при этом не удаляются связанные с ним посредством сложных отношений другие пространственные объекты, так как исходный пространственный объект все еще остается. Только геометрия объекта-источника будет изменена в результате операции разбиения.
![Разбиение объектов-источников Разбиение объектов-источников](GUID-28305D4C-5619-44AE-BA1F-C69BE0389D8C-web.gif)
При разбиении объекта-адресата, участвующего в сложном либо в простом отношении, отношения между разбиваемым объектом и связанными объектами-источниками не удаляются, и связанные объекты-источники тоже не удаляются. Новые отношения устанавливаются между объектом-источником и новым объектом-адресатом, созданным в результате разбиения.
![Разбиение объектов-источников Разбиение объектов-источников](GUID-BE186CF3-9731-411D-84E3-D51D410B2CA9-web.gif)
Описанное здесь поведение при разбиении объектов, связанных отношениями, является поведением по умолчанию. Вы можете изменить это поведение на уровне класса, написав расширение класса, реализующее интерфейс IFeatureClassEdit. Интерфейс IFeatureClassEdit имеет свойство с именем CustomSplitPolicyForRelationship, позволяющее задать, как обрабатываются отношения при разбиении объектов.