在 Standard 或 Advanced 许可等级下可用。
关于关系
关系类可用于保持地理数据库对象之间的关联。这些关系可以是简单的被动关系,也可以是复合关系。复合关系是指父子关系(或组合关系),因此所具有的这种关系行为在关系一方的对象相对于另一方的对象发生更改时触发。地理数据库中要素关联的注记使用复合关系。
关系类中的关系可以使用关系类任意一侧的对象类中的主键和外键存储。或者,如果是多对多 (M–N) 和属性关系类,则关系是独立表中存储的行。
可以使用“属性”窗口或表来查找与任何所选对象相关的所有对象。当您导航到相关对象时,就可以对该对象的属性进行编辑。您还可以使用 ArcMap 编辑工具中断任意两个对象间的关系或在两个对象间创建新关系。以这种方式编辑对象和关系时,可保持所有引用完整性。
添加和删除关系
您可以使用“属性”窗口创建和删除两个对象间的关系。如果关系通过主键和外键来管理(非属性一对一或一对多关系),则将使用源对象中主键的值填充目标对象中的外键。如果两个对象间的关系被删除,目标对象中外键的值将替换为空。目标对象中的外键必须具有可以为空的字段。
如果关系类是多对多或属性关系类,则关系存储在数据库中的独立表中。当在此类型关系类中的两个对象间创建新关系时,会向该表中添加一个新行。此新行使用源对象和目标对象中主键的值进行填充。如果删除两个对象间的关系,则与该关系对应的行将从关系表中删除。
编辑简单关系类中的对象
从地理数据库中删除参与到含其他对象的关系中的对象时,还会删除该对象的所有关系。如果删除的对象是源对象,则所有相关目标对象中的外键都将设置为空。如果删除的对象是目标对象,则源对象不受影响。
如果关系以行的形式保存在关系表中(多对多关系或属性关系),则在删除源对象或目标对象及其关系时,与这些关系对应的行将从关系表中删除。
创建新相关对象
在 ArcMap 中,可以选择一个对象,然后使用“属性”对话框在相关类中创建新的非空间对象。创建该新对象时,系统会使用合适的默认值填充该对象的所有属性,并且关系将重新建立到创建该关系的源对象。只能以这种方式创建非空间对象;不能创建新要素。
如果关系通过主键和外键进行保持,则无论源对象或目标对象是否是使用“属性”对话框创建的,都将使用源对象中的主键填充目标对象中的外键。如果关系以行的形式保存在关系表中(多对多关系或属性关系),则会向关系类的表中添加一个新行。
下面的一组表说明了,当您使用“属性”窗口创建新相关对象时,关系将重新创建到创建该关系的源对象。如果关系通过主键和外键进行保持,则将使用源对象中的主键填充目标对象中的外键。
编辑复合关系类中的对象
复合关系具有一定的特殊行为。编辑参与复合关系的对象时,此行为将传递到编辑过程。对复合关系中的源对象执行的编辑操作通常会直接影响它的相关目标对象。此行为在一定程度上取决于关系类消息发送。
默认情况下,复合关系类的消息发送设置为向前,即,编辑复合关系中的源对象时,复合关系类将消息发送到它的相关目标对象。相关对象将以标准方式响应该消息发送:如果目标对象是非空间对象,将不会发生更改。但是,如果目标对象是要素,则在移动源对象时,目标对象也将移动相同的距离。如果旋转源对象,目标对象将旋转相同的角度。编辑要素几何的各折点被视为更新,移动要素几何不被视为更新。在这种情况下,不移动相关对象。
在本例中,所选蓝色电线杆是源对象,而绿色变压器是目标对象。
与简单关系相同,复合关系也可在删除对象时保持引用完整性,但它们是以不同的方式来执行此操作。删除复合关系中的源对象时,所有通过该复合关系与源对象相关联的对象也将删除。无论消息发送设置为“向前”、“向后”、“双向”还是“无”,此级联删除都会发生。
下面的这组表说明了,删除复合关系中的源对象时,所有通过该复合关系与源对象相关联的所有目标对象也将删除。
删除目标对象时,该对象与源对象间的关系也将删除;源对象本身不会删除或修改。
使用要素关联的注记时,每条注记和由其注记的要素间的链接被建模为复合关系。关系中的父项(或源)就是常规要素,而子项(或目标)是关联注记。
如果具有使用“连接”表建模的多对多关系,则可使用表转关系类地理处理工具将连接两个其他表之间的值的表转换为一个属性关系类。
可以将属性关系类以表的形式添加到 ArcMap。该表出现在 ArcMap 中后,就可打开该表并像其他表那样对其进行编辑。但是,您无法编辑“外键”字段或添加新行,这些操作只能使用属性编辑器完成。
分割参与关系的要素
将单个地理数据库要素分割为两个单独的要素时,将保留原始要素(但会更新几何)并创建一个新要素。分割要素时,较大的部分将保持原始要素的 ObjectID,而较小的部分将是新要素。当要素平均分割时,包含线起点的要素侧将保持为原始要素(原始 ObjectID),而另一半将成为新要素。所分割的要素与数据库中的其他对象存在关系时,这种分割会牵连一些其他问题。
对于简单关系,当分割原始要素时,将删除原始要素及其相关目标对象间的关系。通过分割操作创建新要素时,两个要素都将具有相同的主键值,因此二者都与关联目标对象或要素相关。
对于复合关系,行为有所不同。分割复合关系中的原始要素时,由于原始要素仍然存在,所以不会删除通过复合关系类与原始要素相关联的对象。在分割操作中,仅更改原始要素的几何。
分割简单或复合关系中的目标要素时,不删除原始要素和相关原始对象间的关系。在原始对象和分割操作产生的新要素间创建新关系。
分割具有此处所述关系的对象的行为是默认行为。可以在类级别覆盖此行为,方法是写入实现 IFeatureClassEdit 接口的类扩展。IFeatureClassEdit 接口具有一个名为 CustomSplitPolicyForRelationship 的属性,可用于指定分割要素时处理关系的方法。