当您运行创建关系类地理处理工具时,如何设置参数值取决于所需的关系类类型以及可能需要应用的规则。
为了帮助您了解要使用的值,下文将介绍创建关系类地理处理工具的输入参数。
参数
以下是创建关系类地理处理工具各个参数的解释:
- 源表:与目标表相关联的表或要素类。
- 目标表:与源表相关联的表。
- 输出关系类:将创建的关系类名称。
- 关系类型:指定将在源表和目标表之间创建的关系类型。
- 简单:源表和目标表的关系简单。 这是默认设置。
- 复杂:源表和目标表的关系复杂。
- 前向路径标注:当从源表导航到目标表时,用于唯一标识关系的名称。
- 前后路径标注:当从目标表导航到源表时,用于唯一标识关系的名称。
- 消息方向:指明消息将在源表与目标表之间传递的方向。 例如,在电线杆和变压器之间的关系中,当删除一个电线杆时,将向其相关的变压器对象发送一条信息,说明该电线杆已被删除。
- 向前(源至目标):消息将从源表传递到目标表。
- 向后(目标至源):消息将从目标表传递到源表。
- 双向:消息将从源表传递到目标表,同时从目标表传递到源表。
- 无(不传递任何消息):不传递消息。 这是默认设置。
- 基数:指明源表中的行或要素与目标表中的行或要素之间存在的关系数量。
- 一对一 (1:1):源表中的每个行或要素可以与目标表中的零个或一个行或要素相关联。 这是默认设置。
- 一对多 (1:M):源表中的每个行或要素可以与目标表中的一个或几个行或要素相关联。
- 多对多 (M:N):源表中的几个行或要素可以与目标表中的一个或几个行或要素相关联。
- 已设置关系类属性:指示此关系类是否将含有属性。 有关这些属性的存储位置以及如何创建和填充一个属性关系类的更多信息,请参阅了解属性关系类。
- 选中:关系类将具有属性。
- 不选中:关系类将不具有属性。 这是默认设置。
源主键:通过该源表中的字段(通常缩写为 PK)链接到目标表中的源外键字段,设置一对一或一对多的 无属性关系类。
通过该源表中链接到中间关系类表中源外键字段的字段,设置多对多或属性关系类。
源外键:通过该目标表中的字段(通常缩写为 FK)链接到源表中的源主键字段,设置一对一或一对多的无属性关系类。
通过该中间关系类表中链接到源表中源主键字段的字段,设置一对多或属性关系类。
- 目标主键:目标表中链接到中间关系类表中目标外键字段的字段。 对于多对多或有属性的关系类,此值为必填项,但对于无属性的一对一或一对多关系类,此值应为空。
- 目标外键:中间关系类表中链接到目标表中目标主键字段的字段。 对于多对多或有属性的关系类,此值为必填项,但对于无属性的一对一或一对多关系类,此值应为空。
源类与目标类
创建关系类时,选择一个类作为源类,选择另一个类作为目标类。 不要混淆这两种类至关重要。 在复合关系中采用级联删除行为的情况下,这种重要性显而易见。
在简单关系中,正确理解这一点至关重要。 这是因为当您删除源类中的记录时,简单关系类将在目标类中查找匹配记录,并将其键字段的值设置为“空”。 如果选择错误的类作为源并删除源中的对象,则会在外键字段中引入错误。 以下示例说明了此错误的发生过程:
情况 1:宗地至区域(错误)
这是该错误的一种常见场景。 Zone 表包含对不同分区代码的描述,且在概念上类似于查找表。 在本例中,Parcel 类为源,Zone 表为目标。 问题是在删除宗地时,Zone 表中匹配记录的键字段 (Zone) 中的值设置为“空”,然后其他具有该分区代码的任何宗地在 Zone 表中不会具有匹配项。
情况 2:区域至宗地(正确)
要解决此问题,请将 Zone 表设置为源。 删除宗地(目标对象)时,对 Zone 表没有任何影响;删除“分区”代码(源对象)时,只会将匹配宗地记录中 Zone 字段的值设置为“空”,这一点与实际情况相符,因为它们在 Zone 表中不再有匹配的记录。
输出关系类名称
每种关系类都具有一个在目录窗格中显示的名称。 建议您为关系类命名,以便在名称中描述关系的参与元素和基数。
以源要素类的名称开头,后跟 Has 或 Have,然后以目标要素类的名称结尾。 例如,AddressHasZones 或 ParcelsHaveOwners。 如果关系基数为多对一或多对多,则以复数形式表示源要素类名称,如果关系基数为一对多或多对多,则以复数形式表示目标要素类名称。
您可以使用此方法,根据关系类的名称确定其基数。 例如,ParcelsHaveOwners 的两个要素类均使用复数形式,可以想到它是多对多关系。
地理数据库中的名称必须是唯一的:不能有多个对象(表、要素类、关系类等)使用相同的名称。 请参阅定义要素类属性了解有关要素类和表名称规则和限制的更多信息。
前向标注与后向路径标注
前向标注与后向标注在 ArcGIS Pro 中的属性及识别结果对话框中显示,有助于在相关对象间进行导航。
关系类具有如下两种标注:
- 在从源导航至目标时所显示的前向标注。 在杆式变压器示例中,该标注可显示为支持,这表示此杆支持这些变压器。
- 在从目标导航至源时所显示的后向标注。 在杆式变压器示例中,该标注可显示为已安装,这表示这些变压器安装在此电线杆上。
消息通知方向
正如前文所述,在删除复合关系中的源对象时,相关联的目标对象会自动删除。
无论您使用的是简单关系还是复合关系,可能存在需要更新某一要素以触发其相关要素中更新的其他操作。 此外,在一个方向、另一个方向或两个方向上均可能需要更新。
- 当移动或旋转要素时,需要相关要素与其一起移动或旋转。
- 当更新要素时,需要相关要素中的属性自动更新。
- 更新源对象可要求相关目标对象进行更新。
- 更新目标对象可要求相关源对象进行更新。
如果您的关系需要此行为,当源对象及目标对象发生变化时,您可以让源对象及目标对象通过发送消息来相互通知,以便相关对象进行相应的更新。
为此,在创建关系时,需要设置消息通知方向。 如果更新源对象要求相关目标对象进行更新,请将消息通知方向设置为向前。 如果更新目标对象要求相关源对象进行更新,请将消息通知方向设置为向后。 如果您需要这两者,请将消息通知方向设置为双向。 创建关系后,您必须将该行为设置到接收消息的对象中,以便它们可以作出响应。
唯一的例外情况是当消息发送设置为向前时的复合关系。 如果创建具有向前消息发送的复合关系,则移动或旋转源对象将导致相关目标要素随之自动移动或旋转。 假如正确地建立了这种关系,那么在创建这种关系后此功能即可发挥作用,而无需额外的自定义程序设计。
对于其他消息通知方向,需要进行自定义编程。 除非您正在创建具有向前消息发送的复合关系或者打算对自定义行为进行编程,否则请将消息通知设置为无。 如若不然,每次执行编辑操作时都会生成不必要的消息,会导致性能降低。
在设置复合关系的方向时,请记住,当删除复合关系中的源对象时,将自动删除目标中的所有相关对象。 不管消息发送设置为向前、向后、双向还是无,都会发生这种情况。
方向 | 对简单关系的作用 | 对复合关系的作用 |
---|---|---|
向前 | 除非进行自定义程序设计,否则不起任何作用 |
|
向后 | 除非进行自定义程序设计,否则不起任何作用 |
|
两者 | 除非进行自定义程序设计,否则不起任何作用 |
|
无 | 阻止消息发送,可使性能略微提高 |
|
基数
基数描述两个不同表格行或列之间关联的最大数量。
地理信息系统整合了各种地理和非地理实体对象的信息,其中许多对象都可以相互关联。 将非地理数据添加到要素数据中时,必须考虑对象之间的关联方式以及是否存在共用字段。
关系是围绕源表和目标表的概念以及源表中的对象与目标表中的对象之间的关系构建的。 要在两个表之间创建关系,必须为两个表确定一个具有共同值的字段,即键。
注:
共用字段不必使用相同的名称,但必须使用相同的数据类型。 共用字段中的值用于根据定义的基数链接表中的记录。
关系基数指明源表中有多少对象与目标表中的多少对象相关。 关系类可以拥有以下三种基数之一:
- 一对一:源类或表中的一个行或要素可以与目标类或表中的零个或一个行或要素相关联。 该设置为默认。 例如,一个宗地只能具有一个法定描述。
注:
在 ArcGIS 中,此基数也涵盖多对一。 多对一关系的示例之一就是许多个宗地与相同的法定描述相关联。
- 一对多:源类或表中的一个行或要素可以与目标类或表中的一个或多个行或要素相关联。 例如,一个宗地可能具有许多建筑物。 在一对多关系中,“一”方必须为源类,“多”方必须为目标类。
- 多对多:一个源对象可以与多个目标对象相关联,相反,一个目标对象也可以与多个源对象相关联。 例如,一个给定的房产可能拥有许多个所有者,同时一个给定的所有者可能拥有许多房产。 要了解更多信息,请参阅了解属性关系类。
注:
在评估两个表之间对象的基数时,术语“一”是真正的零对一,而术语“多”则是真正的零对多。 因此,当您创建宗地与建筑物间的一对多关系时,举例来说,该关系将允许下列所有情况:
- 不含建筑物的宗地
- 不含宗地的建筑物
- 具有任意数量建筑物的宗地
如果已经创建了关系类,您可以通过为关系类添加规则来进一步优化基数。 您可以添加规则,指定允许与目标类中的若干行或要素关联的源类或表中的行数或要素数。
注:
基数在创建关系类时定义。 一旦创建了关系类,就不能修改关系类的基数;因此,在创建关系类之前,必须考虑并验证数据的基数。
主键与外键
在关系类中,源表中的对象通过其关键字段中的值匹配目标表中的对象。
在非属性关系类中,当源表中的源主键 (PK) 字段中的值与目标表中的源外键 (FK) 字段中的值直接关联时,就会保持这种关系。 与真实的主键不一样,在关系的主键字段中的每个对象不需要具有唯一的值。 外键字段包含的值与源表中的主键字段相匹配。 此外,键字段的每一行不需要具有唯一的值。
例如,宗地 789 与许可 2 和许可 3 相匹配,因为所有这两个许可记录均具有相同的宗地 ID。
在属性关系类中,例如创建多对多关系时,也可选择自动创建一个中间表。 该中间表将源外键字段和目标外键字段中的值映射到相关表或要素类的主键。 每一行都将一个源对象与一个目标对象相关联。 键字段可能具有不同的名称,但必须具有相同的字段数据类型并且包含相同类型的信息,例如宗地 ID。 除了二进制大对象 (BLOB)、日期和栅格之外,所有数据类型的字段都可能是键字段。
例如,为帮助确定社区内宗地的所有者,可在宗地要素类和所有者独立表之间创建多对多关系类。 这个多对多关系类将创建一个中间表或属性表 ParcelToOwner,将一个或多个所有者与每个宗地关联起来。
并且可在创建关系类时指定键字段。
在确定主键字段时,可以选择使用行 ID 字段,通常称为 ObjectID 字段。 ObjectID 字段在创建要素类/表或者在注册企业级地理数据库图层/表时由 ArcGIS 自动添加。 此字段可确保每条记录具有唯一 ID。 该字段由 ArcGIS 维护,无法对其进行修改。
只要给定对象保留在其原始类中,则其 ObjectID 值永远都不会更改,并且如果该对象为要素,则不会对其进行分割。 如果对某个要素进行分割,则其将保留原始要素(但将更新几何)并创建一个新要素,将为该要素分配一个新的 ObjectID。 因此,只有具有原始 ObjectID 的要素才会保持由 ObjectID 值决定的所有关系。
因此,最好创建并使用您自己的主键字段,而不依赖于 ObjectID 字段。 如下内容描述了您自己的主键字段在执行每个操作时帮助维持关系的方式。
- 在将记录导入到其他要素类或表时,将指定新的 ObjectID 值,同时会丢失基于原始 ObjectID 值的所有关系。 相反,如果您将关系基于另一个主键,则在导入记录时,主键中的 ID 值将不会更改。 这样就可以在将相关对象集导入到新类时保留关系。
一个例外情况是当您使用复制/粘贴功能时。 复制/粘贴将保留 ObjectID 值,因此如果打算仅采用该方法移动对象,则可以使用 ObjectID 字段作为主键。
- 在对某个要素进行分割时,原始要素将会保留(几何将进行更新),并创建一个新要素。 如果您的关系基于原始 ObjectID,则仅在分割中创建的两个要素之一将保持该关系。 但是,如果您使用了另一个字段作为键,则在分割要素时,会将原始要素的 ID 值复制到两个新要素。 因此,在理想情况下,如果将关系类设置为多对多,则相关表中的记录会立即与两个新要素相关联。
如果您不打算分割要素并且确定所有对象都将保留在其原始类中,则可以使用 ObjectID 作为其 ID。 如果无法对此作出保证,建议建立并使用自己的 ID 字段,而不依赖于 ObjectID 字段。
- 在合并两个要素时,新的要素将保留其中一个原始要素的 ObjectID。 如果计划合并要素但却不想将要素从其类中移出或对要素进行分割,可以使用 ObjectID 字段作为主键。