元素引用
对于同一个数据资产,为便于各种组织管理形式,给不同角色的用户提供不同的查看分析数据的视角,一个元素也可以通过引用的方式添加到其他元素的下面做为子元素,称之为元素引用 (Element Reference)。因此一个元素可以有多个父元素,多个引用。通过引用,IDMP 并不会物理的生成一个新的元素,类似文件系统里的 link 概念。
在一个树状结构里创建一个新元素时,该元素便有了第一个引用,因此任何一个元素的引用数总数是大于零的。当元素只有一个引用的时候,一般不会说这个唯一的引用是元素引用,而是直接称之为元素。
一个元素可以被用户直接删除,或当它的父元素被删除时,间接的被删除。由于一个元素的引用数可能大于 1,当您删除在某一个位置的元素时,这个元素不一定被真正删除了。只有当元素的引用总数为 0 时,该元素才被彻底删除或不存在了。为明确元素删除行为,IDMP 对元素引用定义了三种类型,包括强引用、包含引用和弱引用。
强引用
最常用的引用是强引用(Strong)(PI system 里称之为 Parent-Child。创建一个元素时,缺省的引用就是强引用。只要一个元素的强引用的个数大于 0,该元素就不会真正被删除,一定出现在某个树状结构里。如下图:
Wind Turbine-1 与 Wind Turbines,与 Site A, 都是强关系。当删除了元素 Site A 下的 Wind Turbine-1 时,Wind Turbine-1 并没有真正被删除,它还存在于元素 Wind Turbines 下。
包含引用
如果一个元素是另一个元素的一部分,比如一台风机上的电机,那么在这个风机元素和这个电机之间是包含关系 (Composition),这个元素的引用是包含引用。包含引用表示该元素从属于某个父元素,它是一种比强引用更强的引用关系。当在一个元素下创建一个新的子元素时,可以选择包含引用。当把一个包含引用的元素的父元素删除时,该元素被彻底删除,无论该元素是否还存在其他引用,因此它在任何树状结构里都不存在了。如下图:
元素 Motor-A 有两个父元素,其中 Wind Turbine-1 和 Motor-A 之间是包含引用关系。当 Wind Turbine-1 被删除时,所有出现 Motor-A 的地方都被删除了。
弱引用
当您想让两个元素有父子层级关系但是这个关系不影响子元素的生命周期时,可以选择弱引用(Weak)。比如 Wind Turbine-1 在 Wind Turbines 下面是弱引用,但在 Site A 下面是强引用,如果删除 Wind Turbines 下面的 Wind Turbine-1, Site A 下面的 Wind Turbine-1 继续存在,不受任何影响。
但是,如果您删除 Site A 下面的 Wind Turbine-1, 那么 Wind Turbines 下面的 Wind Turbine-1 也被自动删除,因为 Wind Turbine-1 已经不存在有强引用或包含引用了,那么所有弱引用也要被删除。
引用的规则
总结起来,对于元素引用有几个规则:
- 任何一个元素被创建时,它与父元素的关系,用户可以选择强引用或包含引用。
- 任何一个元素可以有 0 到多个弱引用,弱引用可以随意被删除,不影响其他引用或元素的存在
- 任何一个元素至多有一个包含引用
- 如果一个元素没有包含引用,那么它的强引用的数量必须大于 0
- 如果一个包含引用的父元素被删除,该元素的所有引用都需要被自动删除,该元素被彻底删除了。
- 一个元素引用被删除后,如果该元素的强引用及包含引用的总数等于 0,该元素所有的弱引用也需要被自动删除,这个元素就被彻底删除了。
当在一个树状结构里删除一个元素或元素引用,它的子元素或子元素引用也需要被删除。但该元素以及子元素是否继续存在,则要依赖上面的规则做判断。
在 IDMP 的设计里,一个树状结构就是一个分析维度。为避免实现的复杂度,在同一个树状结构下,禁止将一个元素引用在不同的路径里。一个元素可以出现在两个甚至更多个的树状结构里,但是在一个树状结构里,一个元素只能出现一次。在后续的 IDMP 产品规划里,今后会容许一个元素在同一个树状结构里被引用多次。