复制与相关数据

复本创建过程中,会根据应用程序中定义的过滤器向复本中添加行和要素。完成此操作后,将处理关系类以包括其他相关对象。

关系类处理涉及到评估参与至少一个关系类的所有数据集。评估数据集时,将收集所有已复制的行,用于查询相关数据集中的相关行。查询返回的所有相关行都将被添加到复本中。此过程中,每个数据集会被访问一次。

ArcGIS Pro 内,关系类始终按一个方向(向前)处理。前向意味着评估源类,以将目标类中的相关行添加到复本中。在复本创建过程中还可以关闭关系类处理。

以下示例将说明关于相关对象的复制行为。这些示例中所用的数据模型为地产、建筑物及其相关注记之间的简单源-目标关系。

与复制相关的对象

示例一

本例显示的是覆盖八块宗地和六个建筑物的复本区域。创建复本时将额外添加两个建筑物,因为它们都与宗地相关。关系类处理还会向复本添加建筑物和宗地的注记。

使用宗地和建筑物创建具有相关对象的复本

在上述示例中,是使用包括相关对象的默认行为创建复本的。在 ArcGIS Pro 内,可以在使用创建复本地理处理工具时在全局级别下自定义复制并覆盖此行为。在全局级别,可将复制过程配置为不包括任何与已标识为用于复制的要素关联的相关对象。

示例二

本例显示的是在循环关系中发生的情况。复本创建过程中,系统将应用逻辑来中断循环,以避免处理进入死循环。但是,这种逻辑会使处理关系的顺序变得无法预测。

关系类的处理顺序

ObjectID 字段作为主键字段的关系类

复制将 ObjectID 字段用作主键字段的关系类时,在同步过程中需要进行额外处理,这可能会影响性能。在某些情况下,还可能导致意外行为。下面将展开详细介绍。阅读完本节后,您可能会决定修改关系类以使用 ObjectID 字段之外的主键字段。以下是需要考虑的较好备选项:

  • 具有 GlobalID 类型的主键字段和具有 GUID 类型的外键字段的关系类
  • 创建并使用您自己的主键字段,该字段在所有数据库中都是唯一的

ObjectID 字段作为主键字段时同步过程中的额外处理

在地理数据库中,要素类或表中的 ObjectID 值不是唯一的。可为某复本地理数据库中的新行分配与其他复本地理数据库中完全不同的行相同的 ObjectID。如果关系中的主键是 ObjectID 列,则在复本地理数据库之间传递关系时同步过程必须考虑这些差异。为实现这一点,同步过程会检测使用 ObjectID 列的关系类。如果存在这样的类,同步过程将传输稍后用于执行额外处理的附加信息。

该处理包括针对每个编辑的关系,调整外键值使其指向目标地理数据库中合适的 ObjectID 值。对于编辑了大量关系的情况,该额外处理可能会对同步性能产生显著影响。

ObjectID 字段作为主键字段时的意外行为

下述内容介绍将 ObjectID 字段用作主键字段时可能会观察到意外行为的情况:

  • 在目标复本地理数据库中不存在源行的情况下进行编辑 - 如上所述,当 ObjectID 字段是关系类中的主键字段时,为维持关系,同步过程需要执行额外处理。但是,当编辑涉及到参照关系复本地理数据库中不存在的源行时,则不能维持关系。对于插入,这会导致目标行中的外键被设置为空。对于更新,目标行中的外键值将保持不变,与同步之前相同。请注意,此行为不适用于检出/检入复本。
    目标复本地理数据库中不存在源行的示例
    • 上图显示的是宗地和建筑物之间存在简单关系类的情况,其中宗地要素类的 ObjectID 字段为源主键。在本例中,仅为一定空间范围内的宗地和建筑物创建了复本。然而,在创建完复本后检测出一个数字化错误,即发现某个建筑物被数字化到错误的宗地中。校正的方法是在父复本地理数据库中移动建筑物并编辑关系使其与正确的宗地相关。然后,对复本进行同步以将更改应用到子复本中。在这种情况下,建筑物会被移动,但在子复本中它仍与错误的宗地相关。子复本中的关系未发生更改,因为子复本地理数据库中不存在正确的源行(父复本中 ObjectID 为 102 的宗地)。在此类情况下,关系不会改变。

  • 悬挂外键 - 创建复本时,会根据复本的定义将行从源地理数据库复制到目标地理数据库。定义复本时,可以选择在目标表中包括部分行但不包括源表中对应的相关行。目标表中这些不相关行的外键值与其在源地理数据库中的相同。这些是悬挂外键,因为它们引用的源行在目标地理数据库中不存在。
    复制带悬挂外键的相关数据的示例
    • 上图介绍的是由具有悬挂外键导致意外行为的示例。这里,父复本地理数据库的宗地和建筑物之间存在简单关系类。宗地要素类是源,用 ObjectID 字段作为主键。创建的复本包括城市中的所有建筑物和一块街区的宗地。复本创建过程将相应的宗地和建筑物从父复本地理数据库复制到子复本地理数据库。在子复本中,与该街区以外的宗地相关的建筑物具有悬挂外键,因为这些宗地不属于复本。例如,由于子复本中不存在 ObjectID 为 100 的宗地,因此外键为 100 的建筑物具有悬挂外键。如果在子复本中创建一块新宗地并指定其 ObjectID 为 100,则会被动地将该宗地将与上述建筑物相关联。

相关主题