
# 树形结构实践
#### 概述
树形结构指的是数据元素之间存在着"一对多"的树形关系的数据结构，是一类重要的非线性数据结构。在树形结构中，树根节点没有前驱节点，其余每个节点有且只有一个前驱节点。叶子节点没有后续节点，其余每个节点的后续节点数可以是一个也可以是多个。
为了便于用户维护数据之间的父子关系，工业数字模型驱动引擎（Industrial Digital Model Engine，简称iDME）提供树形结构功能。用户可在应用设计态创建数据实体时，在功能列表中勾选"树形结构"，即可使用此功能。
具有树形结构功能的数据实体会自动生成五个系统属性"ParentNode"、"LeafFlag"、"RawFullPath"、"RootNode"和"FullPath"，用户可以在该数据实体的详情页面查看对应属性的信息，具体操作请参见[查看数据实体（设计态）](https://support.huaweicloud.com/usermanual-idme/idme_usermanual_0013.html)和[查看数据实体（运行态）](https://support.huaweicloud.com/usermanual-idme/idme_clientog_0010.html)。
同时，具有树形结构功能的数据实体对外提供如下8个树形结构原子接口。系统会基于这些原子接口，自动生成对应的数据服务API。生成的API名称格式略有不同，请以实际应用运行态中"数据服务管理 \> 全量数据服务"页面展示的API信息为准。更多详情，请参见[全量数据服务](https://support.huaweicloud.com/usermanual-idme/idme_clientog_0154.html)。
表1树形结构相关接口 
| 接口名称                  | 描述                                                                                      |
|:---|:---|
| BatchAddChildNode     | 为指定的父节点批量添加指定的子节点。                                                                      |
| BatchRemoveChildNode  | 根据入参的父项ID，批量移除指定的子节点。                                                                   |
| GetChildList          | 获取单层子节点。                                                                                |
| GetParent             | 获取单层父节点。                                                                                |
| GetAllParentList      | 获取指定节点的父节点，直至根节点。                                                                       |
| GetRoot               | 获取根节点/顶层父节点。                                                                            |
| Refresh               | 根据ID刷新指定节点全路径/父节点的整棵子树所有节点的全路径。                                                         |
| DeleteNodeRecursively | 递归删除指定节点及其节点下的所有节点。 此接口仅支持具有树形结构功能的单实体使用。 |
   
#### 约束与限制
- 如果数据实体的父模型具有树形结构，该数据实体自动继承树形结构功能，且不可去除勾选。如果后续父模型删除了树形结构功能，该数据实体将不再继承父模型的树形结构功能，但可以自己重新勾选树形结构功能。
- 如果数据实体为Master-Branch-Version（M-V）模型实体（即"父模型"选择为"VersionObject"），则只能在Master模型上选择树形结构功能，Version模型和Branch模型不支持选择树形结构功能。
- 当您需要处理大量数据实例并调用DeleteNodeRecursively接口时，建议为"RawFullPath"属性字段创建索引，以提高查询效率和系统性能。
 
 #### 示例场景
常见的应用系统（如ERP、采购、财务等）中都会包含人员管理，而人员管理往往都是以组织的形式进行管理和展示。这种场景下，树形结构是此功能的基础核心，所有人员的权限操作都是依附于组织。
图1某企业组织架构图   
![](https://support.huaweicloud.com/bestpractice-idme/figure/zh-cn_image_0000001796754221.png "点击放大")
某企业的组织架构如[图1]所示，根据树形结构进行分析，可得知：
- 黄色方框的部门没有父节点，即为根节点。
- 红色方框的部门没有子节点，即为叶子节点。
- 绿色方框的部门均有子节点。
为此，您可在构建数据模型时，创建一个具有"树形结构"功能的数据实体用于管理此企业的组织。而后在其数据实体实例化时，通过指定"ParentNode"的属性值来实现组织管理。
如下操作步骤仅指导您如何通过可视化页面使用树形结构功能。关于如何通过API方式使用树形结构功能请参见[全量数据服务](https://support.huaweicloud.com/usermanual-idme/idme_clientog_0154.html)。
#### 操作步骤
1. [登录应用设计态](https://support.huaweicloud.com/consog-idme/idme_consog_0013.html)。
2. 在左侧导航栏中，选择"数据模型管理 \> 数据实体"，进入数据实体页面。
3. 单击"创建"，根据如下主要信息，创建一个具有"树形结构"功能的数据实体（例如OrganizationalStructure）。 
   图2树形结构   
   ![](https://support.huaweicloud.com/bestpractice-idme/figure/zh-cn_image_0000002497874116.png "点击放大")
   表2主要参数信息 
   | 类型   | 参数   | 参数说明                     |
   |:---|:---|:---|
   | 基本信息 | 英文名称 | OrganizationalStructure。 |
   | 基本信息 | 中文名称 | 组织结构。                    |
   | 基本信息 | 中文描述 | 某公司的部门结构。                |
   | 基本信息 | 模型类型 | 选择"实体模型"。                |
   | 基本信息 | 父模型  | 保持默认，此处以BasicObject为例。   |
   | 功能列表 | 可选功能 | 添加"树形结构"功能。              |
      
   
   
4. 选择"属性"页签，新增一个"文本"类型的属性"DepartmentName"，用于记录部门名称。 
   图3属性   
   ![](https://support.huaweicloud.com/bestpractice-idme/figure/zh-cn_image_0000001749913436.png "点击放大")
   
   
5. 选择"功能配置"页签，在"设置规则 \> 树形结构"栏设置树形结构的规则。 
   此处以设置"指定全路径字段"为"ID"为例。
   图4功能配置   
   ![](https://support.huaweicloud.com/bestpractice-idme/figure/zh-cn_image_0000001796754225.png "点击放大")
   
   
6. 依次完成"发布数据实体 \> 发布应用 \> 部署应用"的操作，具体操作请参见[发布数据实体](https://support.huaweicloud.com/usermanual-idme/idme_usermanual_0010.html)、[发布应用](https://support.huaweicloud.com/usermanual-idme/idme_usermanual_0085.html)和[部署应用](https://support.huaweicloud.com/consog-idme/idme_consog_0022.html)。
7. 待应用完成部署后，[登录应用运行态](https://support.huaweicloud.com/consog-idme/idme_consog_0023.html)。
8. 在"数据模型管理 \> 数据实体"中，找到并编辑"OrganizationalStructure"数据实体，将"实例界面显示"设置为"是"。
9. 在"数据模型管理 \> 数据实例"中，选择数据实体"OrganizationalStructure"，根据[示例场景]的企业组织架构，依次创建如下数据实例。
   
    表3数据实例信息 
   | 唯一编码（ID） | 部门名称（DepartmentName） | 父节点（ParentNode） |
   |:---|:---|:---|
   | 10001    | 公司股东会                | -               |
   | 20001    | 股东会秘书                | 10001           |
   | 20002    | 总经理                  | 10001           |
   | 20003    | 监事会                  | 10001           |
   | 30001    | 技术总监                 | 20002           |
   | 30002    | 营销总监                 | 20002           |
   | 30003    | 生产总监                 | 20002           |
   | 30004    | 财务总监                 | 20002           |
   | ......   | ......               | ......          |
      
   为篇幅起见，[表3]仅列出部分数据实例信息。
   
   
 
