关联关系建模

概述

  • 在 UModel 数据建模体系中,Link(关联关系)是连接不同数据集合的重要机制。通过 Link,我们可以建立 EntitySet 之间、EntitySet 与 DataSet 之间,以及 DataSet 与 Storage 之间的关联关系,构建完整的数据关系网络。

  • UModel 提供三种类型的 Link 来满足不同的关联场景:

    Link类型

    用途

    连接对象

    EntitySetLink

    定义实体间的关系

    EntitySet <-> EntitySet

    DataLink

    定义数据集的关联

    EntitySet/EntitySetLink -> DataSet

    StorageLink

    定义存储映射关系

    EntitySet/EntitySetLink/DataSet -> Storage

应用案例

当前应用案例相关素材,请参考:umodel.zip

基本概念

EntitySetLink 用于定义两个 EntitySet 之间的关系,是构建实体关系图的核心组件。每个 EntitySetLink 必须包含:

  • 源 EntitySet:关系的起始点。

  • 目标 EntitySet:关系的终点。

  • 链接类型:描述关系的性质。

关系类型

EntitySetLink 支持丰富的关系类型,涵盖各种业务场景:

关系类型

含义

应用场景

calls

调用

服务调用关系

runs

运行

进程运行关系

instance_of

实例

实例与类型关系

parent_of

父级

层级关系

contains

包含

容器关系

manages

管理

管理关系

monitors

监控

监控关系

serves

服务

服务提供关系

hosted_by

托管于

部署关系

related_to

关联到

通用关联关系

核心配置

字段映射

通过fields_mapping定义源 EntitySet 和目标 EntitySet 之间的字段对应关系:

spec:
  fields_mapping:
    source_field_1: target_field_1
    source_field_2: target_field_2

动态关系

设置dynamic: true可启用动态 EntitySetLink:

  • 关系内容从 Storage 实时获取,而非存储在 EntityStore 中。

  • 适用于关系频繁变化的场景。

  • 需要配合 Storage 使用。

配置示例

kind: entity_set_link
schema:
  url: "umodel.aliyun.com"
  version: "v0.1.0"
metadata:
  name: "apm.service_calls_apm.service"
  display_name:
    en_us: >
      Service-Calls-Service
    zh_cn: "应用-调用-应用"
  description:
    en_us: >
      The link between "apm.service" and "apm.service".
    zh_cn: "应用-调用-应用"
  domain: apm
spec:
  src:
    domain: apm
    kind: entity_set
    name: apm.service
  dest:
    domain: apm
    kind: entity_set
    name: apm.service
  entity_link_type: calls

基本概念

DataLink 用于定义 EntitySet/Link 与 DataSet 之间的关系,以及 DataSet 之间的关联。它是连接实体模型和数据模型的桥梁。

链接类型

DataLink 支持两种链接类型:

类型

含义

使用场景

produce

产生

EntitySet产生相关的数据集

related_to

关联

弱关联关系,数据间存在相关性

核心配置

字段映射

定义源数据集和目标数据集之间的字段对应关系:

spec:
  fields_mapping:
    entity_id: data_entity_id
    timestamp: data_time

数据过滤

通过data_filter可对目标数据进行过滤(不推荐使用):

spec:
  data_filter: "type='db'"  # 过滤出数据库类型的指标

注意data_filter使用query类型的filter语法,较为复杂,建议通过其他方式实现数据过滤。

配置示例

kind: data_link
schema:
  url: "umodel.aliyun.com"
  version: "v0.1.0"
metadata:
  name: "apm.service_related_to_apm.metric.apm.service"
  display_name:
    en_us: >
      APM Service - APM Service Request Metrics
    zh_cn: "应用-流量指标"
  description:
    en_us: >
      The link between "apm.service" and "apm.metric.apm.service".
    zh_cn: "应用-流量指标"
  domain: apm
spec:
  src:
    domain: apm
    kind: entity_set
    name: apm.service
  dest:
    domain: apm
    kind: metric_set
    name: apm.metric.apm.service
  data_link_type: related_to
  fields_mapping:
    "service_id": "acs_arms_service_id"

基本概念

StorageLink 定义 EntitySet/EntitySetLink/DataSet 与 Storage 之间的映射关系,实现数据集合与底层存储的连接。

核心配置

字段映射

定义数据集合字段与存储字段之间的映射关系:

spec:
  fields_mapping:
    logical_field_name: storage_column_name
    entity_id: storage_id
    timestamp: storage_time

配置示例

kind: storage_link
schema:
  url: "umodel.aliyun.com"
  version: "v0.1.0"
metadata:
  name: "app.log.common_storage_link"
  display_name:
    en_us: >
      App Log Set Storage Link
    zh_cn: "应用日志数据集存储链接"
  description:
    en_us: >
      Storage link for app log set data.
    zh_cn: "应用日志数据集的存储链接"
  domain: apm
spec:
  src:
    domain: app
    kind: log_set
    name: app.log.common
  dest:
    domain: app
    kind: sls_logstore
    name: app.log.common.storage

高级配置:字段映射配置

字段映射原则

字段映射(fields_mapping)是 Link 建模中的核心配置,用于建立源对象和目标对象之间的字段对应关系。正确的字段映射设计是确保数据关联准确性的关键。

核心原则

  1. 主键优先映射:实体到 DataSet 的关联中,必须配置实体的主键字段到 DataSet 字段的映射。

  2. 完整性保证:映射应覆盖所有关键标识字段,确保能够精确定位特定实体的数据。

  3. 类型兼容性:确保源字段和目标字段的数据类型兼容。

  4. 语义一致性:映射的字段应具有相同的业务语义。

实体主键映射示例

APM应用实体为例,应用实体的主键字段需要完整映射到指标数据,此外,由于 APM 的服务名也是唯一的,且和MetricSet中的服务名一致,因此需要进行映射。

# APM应用实体关联指标数据
kind: data_link
metadata:
  name: "apm.service_related_to_apm.metric.apm.service"
spec:
  src:
    domain: apm
    kind: entity_set
    name: apm.service
  dest:
    domain: apm
    kind: metric_set
    name: apm.metric.apm.service
  data_link_type: related_to
  fields_mapping:
    # 实体主键字段映射
    "service_id": "acs_arms_service_id"    # 应用唯一标识,主键字段
    "service_name": "service"              # 应用名称

层次实体映射示例

以阿里云 NAS 文件系统为例,展示如何建立实体与多类型指标的映射:

# NAS实体关联CPFS指标
kind: data_link
metadata:
  name: "acs.nas.filesystem_related_to_acs.metric.prometheus_cpfs_userid_filesystemid"
spec:
  src:
    domain: acs
    kind: entity_set
    name: acs.nas.filesystem
  dest:
    domain: acs
    kind: metric_set
    name: acs.metric.prometheus_cpfs_userid_filesystemid
  data_link_type: related_to
  fields_mapping:
    # 完整的实体主键映射
    region_id: region_id                 # 区域标识
    resource_group_id: resource_group_id # 资源组标识
    instance_id: fileSystemId           # 文件系统实例ID
    user_id: userId                     # 用户标识

高级配置:过滤条件配置

UModel提供两种过滤机制来精确控制数据关联的范围,它们的使用场景和过滤对象完全不同。

filter_by_entity:实体级过滤

filter_by_entity用于在源实体层面进行过滤,只有满足条件的实体才会建立 Link 关联。

注意:filter_by_entity 的语法为 SPL Bool 表达式语法的子集,关于 UModel 中 SPL 表达式语法,请参考SPL基础语法

使用场景

  • 同一个 EntitySet 包含多种子类型,需要针对特定子类型建立关联。

  • 根据实体属性值筛选需要关联的实体范围。

  • 根据特定实体,选择对应的存储实例(Storage)。

配置示例

NAS文件系统为例,根据文件系统类型建立不同的指标关联:

# CPFS类型文件系统关联CPFS指标
kind: data_link
metadata:
  name: "acs.nas.filesystem_related_to_acs.metric.prometheus_cpfs_userid_filesystemid"
spec:
  src:
    domain: acs
    kind: entity_set
    name: acs.nas.filesystem
  dest:
    domain: acs
    kind: metric_set
    name: acs.metric.prometheus_cpfs_userid_filesystemid
  data_link_type: related_to
  filter_by_entity: file_system_type in ('cpfs', 'bmcpfs')  # 只关联CPFS类型
  fields_mapping:
    region_id: region_id
    instance_id: fileSystemId
    user_id: userId
# 标准NAS类型文件系统关联NAS指标
kind: data_link
metadata:
  name: "acs.nas.filesystem_related_to_acs.metric.prometheus_nas_userid_filesystemid"
spec:
  src:
    domain: acs
    kind: entity_set
    name: acs.nas.filesystem
  dest:
    domain: acs
    kind: metric_set
    name: acs.metric.prometheus_nas_userid_filesystemid
  data_link_type: related_to
  filter_by_entity: file_system_type = 'standard'  # 只关联标准NAS类型
  fields_mapping:
    region_id: region_id
    instance_id: fileSystemId
    user_id: userId

data_filter:数据级过滤

data_filter用于在目标数据层面进行过滤,即目标DataSet中只有满足条件的数据与源实体建立关联。

注意:data_filter 的语法为 SPL Bool表达式语法的子集,关于 UModel 中 SPL 表达式语法,请参考SPL基础语法

使用场景

  • 目标 DataSet 包含多种数据类型,只需要关联特定类型的数据。

  • 根据数据内容筛选相关数据范围。

  • 实现数据的条件关联。

配置示例

# 应用实体关联数据库类型的调用指标
kind: data_link
metadata:
  name: "apm.service_related_to_database_metrics"
spec:
  src:
    domain: apm
    kind: entity_set
    name: apm.service
  dest:
    domain: apm
    kind: metric_set
    name: apm.metric.external_calls
  data_link_type: related_to
  data_filter: "call_type='database'"  # 只关联数据库调用的指标数据
  fields_mapping:
    service_id: service_id

过滤条件对比

过滤类型

过滤对象

使用场景

语法

filter_by_entity

源实体

实体分类、实体属性筛选

查询语法表达式

data_filter

目标数据

数据分类、数据内容筛选

查询语法表达式

过滤配置最佳实践

1. 优先使用filter_by_entity

  • 在实体层面进行过滤性能更好。

  • 语义更清晰,易于理解和维护。

  • 避免复杂的查询语法。

2. 谨慎使用data_filter

  • data_filter使用查询语法,较为复杂。

  • 会影响查询性能,应避免过于复杂的过滤条件。

  • 建议通过多个专门的DataSet替代复杂的data_filter。

3. 过滤条件设计原则

  • 精确性:过滤条件应准确反映业务需求。

  • 性能性:避免影响查询性能的复杂条件。

  • 可维护性:过滤条件应易于理解和修改。

4. 实际应用建议

场景

推荐方案

原因

实体子类型分组

使用filter_by_entity

实体层面筛选,性能好

数据内容过滤

创建专门的DataSet

避免复杂查询语法

临时数据筛选

使用data_filter

快速实现特殊需求

注意事项

  • 合理设计 Link 的粒度和数量。

  • 定期检查关系图的拓扑结构。

  • 谨慎使用动态 Link,需要额外的存储查询开销。

  • 确保 Link 两端的实体/数据集确实存在。

  • 及时更新因实体变更导致的 Link 失效。