复制与相关数据
本主题仅适用于 ArcGIS for Desktop Standard 和 ArcGIS for Desktop Advanced。
复本创建过程中,会根据应用程序中定义的过滤器向复本中添加行和要素。完成此操作后,将处理关系类以包括其他相关对象。
关系类处理涉及到评估参与至少一个关系类的所有数据集。评估数据集时,将收集所有已复制的行,用于查询相关数据集中的相关行。查询返回的所有相关行都将被添加到复本中。此过程中,每个数据集会被访问一次。
每个关系类只沿一个方向处理。默认情况下为前向,不过也可以在创建时将其更改为后向。前向意味着评估源类,以将目标类中的相关行添加到复本中。后向意味着评估目标类,以将源类中的相关行添加到复本中。在复本创建过程中还可以关闭特定关系类的关系类处理。
由于每个数据集只评估一次,且每个关系类最多只能沿一个方向处理,因此评估数据集的顺序十分重要。系统以依次添加最相关对象的原则处理数据集。可通过更改方向或关闭特定关系类的处理来影响数据集的处理顺序。
以下示例将说明关于相关对象的复制行为。这些示例中所用的数据模型为地产、建筑物及其相关注记之间的简单源-目标关系。
示例一
本例显示的是覆盖八块宗地和六个建筑物的复本区域。创建复本时将额外添加两个建筑物,因为它们都与宗地相关。关系类处理还会向复本添加建筑物和宗地的注记。
示例二
本例显示的是通过前向处理复制关系。通过在父复本中选择所要复制的两个建筑物,并对相关记录应用默认的前向处理方向,可将与这两个建筑物相关的注记也复制到子复本。
下图显示的是同样选择那两个建筑物,但决定针对 prop_build 关系类应用后向处理方向的情况。此时,除相关建筑物注记外,还将包括与那两个建筑物相关的宗地以及宗地的注记。
示例三
在之前的示例中,是使用包括相关对象的默认行为创建复本的。可以在全局或本地级别覆盖此行为来自定义复制。在全局级别,可将复制过程配置为不包括任何与已标识为用于复制的要素关联的相关对象。
在本例中,选择了复本区域中建筑物和地产,但由于已选择排除相关记录选项,因此不会复制与建筑物和宗地关联的注记。
示例四
在本例中,虽然复本区域包括四块具有相关建筑物的地产(17691、17692、17698、17697),但已经从复制中明确排除所有建筑物。由于始终包括相关对象的全局默认行为对其他要素类仍然有效,因此复本中还会包括地产注记。
示例五
本例显示的是在循环关系中发生的情况。复本创建过程中,系统将应用某种逻辑来中断循环,以避免处理进入死循环。但是,这种逻辑会使处理关系的顺序变得无法预测。
要在循环关系中获得可预测的结果,可以选择不处理某个关系或选择后向处理某个关系类。例如,下图显示的是将 R3 设置为后向处理的情况。现在,可预测的处理顺序为 T1 - T2 - T3。这里,T3 将包含从 T1 和 T2 添加的相关记录,但不会向 T1 或 T2 添加将任何 T3 的记录。
“对象 ID”字段作为主键字段的关系类
复制将“对象 ID”字段用作主键字段的关系类时,在同步过程中需要进行额外处理,这可能会影响性能。在某些情况下,还可能导致意外行为。下面将展开详细介绍。阅读完本节后,您可能会决定修改关系类以使用“对象 ID”字段之外的主键字段。较好的备选项包括:
- 包含类型为 GlobalID 的主键字段和类型为 GUID 的外键字段的关系类
- 您自己的主键字段,在所有数据库中唯一
“对象 ID”字段作为主键字段时同步过程中的额外处理
在地理数据库中,要素类或表中的“对象 ID”值不是唯一的。可为某复本地理数据库中的新行分配与其他复本地理数据库中完全不同的行相同的对象 ID。如果关系中的主键是“对象 ID”列,则在复本地理数据库之间传递关系时同步过程必须考虑这些差异。为实现这一点,同步过程会检测使用“对象 ID”列的关系类。如果存在这样的类,同步过程将传输稍后用于执行额外处理的附加信息。该处理包括针对每个编辑的关系,调整外键值使其指向目标地理数据库中合适的“对象 ID”值。对于编辑了大量关系的情况,该额外处理可能会对同步性能产生显著影响。
“对象 ID”字段作为主键字段时的意外行为
下面介绍可能会出现意外行为的情况:
在目标复本地理数据库中不存在源行的情况下进行编辑 - 如上所述,当“对象 ID”字段是关系类中的主键字段时,为维持关系,同步过程需要执行额外处理。但是,当编辑涉及到引用关系复本地理数据库中不存在的源行时,则不能维持关系。对于插入,这会导致目标行中的外键被设置为空。对于更新,目标行中的外键值将保持不变,与同步之前相同。请注意,使用检出复本不会发生此行为。
上图显示的是宗地和建筑物之间存在简单关系类的情况,其中宗地要素类的“对象 ID”字段为源主键。在本例中,仅为一定空间范围内的宗地和建筑物创建了复本。然而,在创建完复本后检测出一个数字化错误,即发现某个建筑物被数字化到错误的宗地中。校正的方法是在父复本地理数据库中移动建筑物并编辑关系使其与正确的宗地相关。然后,对复本进行同步以将更改应用到子复本中。在这种情况下,建筑物会被移动,但在子复本中它仍与错误的宗地相关。子复本中的关系未发生更改,因为子复本地理数据库中不存在正确的源行(父复本中对象 ID 为 102 的宗地)。在此类情况下,关系不会改变。
悬挂外键 -
创建复本时,会根据复本的定义将行从源地理数据库复制到目标地理数据库。定义复本时,可以选择在目标表中包括部分行但不包括源表中对应的相关行。目标表中这些不相关行的外键值与其在源地理数据库中的相同。这些是悬挂外键,因为目标地理数据库中不存在它们引用的源行。
上图介绍的是由具有悬挂外键导致意外行为的示例。这里,父复本地理数据库的宗地和建筑物之间存在简单关系类。宗地要素类是源,用“对象 ID”字段作为主键。创建的复本包括城市中的所有建筑物和一块街区的宗地。复本创建过程将相应的宗地和建筑物从父复本地理数据库复制到子复本地理数据库。在子复本中,与该街区以外的宗地相关的建筑物具有悬挂外键,因为这些宗地不属于复本。例如,由于子复本中不存在对象 ID 为 100 的宗地,因此外键为 100 的建筑物具有悬挂外键。如果在子复本中创建一块新宗地并指定其对象 ID 为 100,则会被动地将该宗地将与上述建筑物相关联。