iBizModel 实体数据集(PSDEDATASET)与实体数据查询(PSDEDATAQUERY)模型详解

iBizModel 是一个全面的企业级模型体系,涵盖了从数据存储到前端交互的全栈架构。在数据层,实体数据集(PSDEDATASET)和实体数据查询(PSDEDATAQUERY)是两个核心模型,它们共同定义了数据的查询、组合和提供能力。PSDEDATASET 用于封装和提供数据集合,支持多种数据源和聚合方式;PSDEDATAQUERY 则定义了原子级的查询逻辑,包括条件、连接和过滤。这两个模型通过 PSDEDSDQ(实体数据集合查询)进行关联,使得数据集可以灵活引用多个查询来构建复杂的数据视图。

1. PSDEDATASET(实体数据集)模型深度解析

PSDEDATASET 是 iBizModel 中定义实体数据集合的模型,它充当数据提供者角色,用于对外暴露实体的数据集查询能力。数据集可以基于多种来源构建,包括联合多个数据查询、引用代码表、远程接口或自定义脚本,从而支持复杂的业务场景如报表生成、数据分析和界面展示。

关键属性与枚举值详细说明

  • 基本属性

    • name(必填):数据集的唯一标识。
    • logicname:中文名称,用于业务描述,如 “订单数据集”。
    • codename:代码标识,用于服务调用或代码生成,需在实体中唯一。
    • psdeid(必填):引用父实体 PSDATAENTITY,指定数据集所属的实体,确保数据集的上下文正确。
    • predefinedtype:预定义类型枚举,包括:
      • CODELIST:从代码表取数,适用于静态数据如国家列表。
      • INDEXDE:基于索引实体,用于快速检索。
      • DELOGIC:来自实体处理逻辑,支持动态数据生成。
      • SCRIPT:自定义脚本,允许灵活的数据处理。
      • REMOTE:远程接口数据集,用于集成外部服务。
      • 这些类型决定了数据集的来源和行为,选择合适类型可以优化性能。
    • retvaltype:返回值类型枚举,如 PAGE(分页结果)、ENTITY(单个对象)、ENTITIES(对象数组),用于定义输出格式,适应不同前端需求。
    • enablegroup:分组模式枚举,支持无分组、指定分组参数或聚合关系,用于数据聚合场景如统计报表。
    • unionmode:连接模式枚举,如 UNION(排重连接)或 UNIONALL(全部连接),用于合并多个查询结果,避免重复或保留所有数据。
  • 高级功能属性

    • enableaudit:是否启用访问审计,用于安全监控,记录数据访问日志。
    • enableorgdr, enablesecdr, enableuserdr:是否启用组织、部门或用户数据范围,支持数据权限控制,确保用户只能访问授权数据。
    • pagesize:分页大小,默认 -1 表示无分页,适用于大数据集的分页处理。
    • actionholder:逻辑所有者枚举,指定数据集在前端、后台或两者同时可用(值 1、2、3),控制数据集的执行环境。
    • customcode:内联代码,用于自定义数据处理逻辑,提供扩展性。

应用场合
PSDEDATASET 广泛应用于需要数据聚合、分页、权限控制或混合数据源的场景:

  • 报表系统:通过联合多个查询(如销售订单和产品信息)生成综合报表。例如,定义一个数据集联合订单查询和产品查询,使用 UNION 模式合并数据,并启用分组统计销售额。
  • 数据看板:使用分组和聚合模式(如按部门统计销售额),通过 enablegroupPSDEDSGRPPARAM 实现。
  • 权限管理:启用用户数据范围(enableuserdr),确保用户只能访问自己的数据,如 CRM 系统中的客户数据。
  • 外部集成:通过 REMOTE 类型从外部服务获取数据,支持微服务架构,如从第三方 API 获取天气数据。
  • 高性能查询:使用 predefinedtypeINDEXDEDELOGIC,优化查询性能。

成员模型
PSDEDATASET 包含嵌套成员,用于细化配置:

  • PSDEDSPARAM:定义数据集参数,支持输入输出控制,如定义查询参数的类型和默认值。
  • PSDEDSDQ:连接数据查询,允许数据集引用多个 PSDEDATAQUERY,实现数据聚合。
  • PSDEDSGRPPARAM:定义分组参数,用于数据聚合,如指定分组字段和聚合操作(SUM、AVG)。

DSL 示例
以下是一个订单数据集的 DSL 示例,展示如何定义数据集并引用查询:

// 定义实体引用
def de_order = "Demo.ORDER"

// 创建数据集
psdedataset (
  name: "OrderDataset"
  ,codename: "OrderDataset"
  ,psdeid: de_order
  ,logicname: "订单数据集"
  ,predefinedtype: "SCRIPT" // 自定义脚本类型
  ,retvaltype: "PAGE" // 分页返回
  ,pagesize: 20
  ,enableuserdr: 1 // 启用用户数据范围
){
  // 定义参数
  psdedsparam (
    name: "StatusParam"
    ,valuetype: "INPUTVALUE"
    ,stddatatype: 25 // VARCHAR
    ,value: "10"
    ,paramdesc: "订单状态参数"
  )
  // 引用数据查询
  psdedsdq (
    name: "OrderQueryRef"
    ,psdedqid: de_order + ".OrderQuery" // 引用数据查询
    ,ordervalue: 1
  )
}
2. PSDEDATAQUERY(实体数据查询)模型深度解析

PSDEDATAQUERY 定义了实体的原子数据查询,支持复杂的查询逻辑,包括条件过滤、多表连接和自定义代码。它是数据检索的基础单元,可以被数据集或其他模型引用。

关键属性与枚举值详细说明

  • 基本属性

    • name(必填):查询的唯一标识,如 “OrderQuery”。
    • codename:代码标识,用于服务调用。
    • psdeid(必填):引用父实体 PSDATAENTITY。
    • viewcollevel:查询列级别枚举,控制返回数据的详细程度,如:
      • -1:默认全部列。
      • 0:全部数据。
      • 2:关键数据(减少不必要字段)。
      • 100:指定属性组。
        这有助于优化查询性能,减少不必要的数据传输。
    • enablepql:是否启用 PQL(Pseudo Query Language),支持高级查询语法。
    • queryviewflag:是否从数据视图中查询,优化性能,避免直接访问底层表。
  • 连接与条件

    • 通过成员模型 PSDEDQJOIN 定义查询连接,支持多种连接类型(如 INNER JOIN、EXISTS)。
    • 通过 PSDEDQCOND 定义查询条件,支持组合条件(AND/OR)、属性条件或自定义条件。

应用场合
PSDEDATAQUERY 适用于需要精确数据检索的场景:

  • 过滤查询:如根据状态、时间范围过滤订单数据。例如,定义一个查询过滤状态为 “已完成” 的订单。
  • 多表关联:通过连接查询获取相关实体数据,如订单关联产品信息,使用 PSDEDQJOINN1 类型。
  • 权限过滤:结合用户上下文添加条件,如只查询当前用户创建的数据,使用 PSDEDQCOND 与会话变量。
  • 高性能查询:使用 queryviewflag 直接从视图查询,减少数据库负载。

成员模型

  • PSDEDQJOIN:定义查询连接,支持自嵌套和多种连接类型。
  • PSDEDQCOND:定义查询条件,支持层级组合。

DSL 示例

def de_order = "Demo.ORDER"

psdedataquery (
  name: "SimpleOrderQuery"
  ,codename: "SimpleOrderQuery"
  ,psdeid: de_order
  ,logicname: "简单订单查询"
  ,viewcollevel: 2 // 关键数据
){
  psdedqjoin (
    name: "MainJoin"
    ,psdejointypeid: "MAIN"
    ,joinpsdeid: de_order
    ,aliasname: "o"
  ){
    psdedqcond (
      name: "StatusCondition"
      ,condtype: "SINGLE"
      ,psdefid: de_order + ".Status"
      ,psdbvalueopid: "EQ"
      ,condvalue: "Completed"
    )
  }
}
3. 应用场合对比与差异点分析

PSDEDATASET 和 PSDEDATAQUERY 在应用中有明显差异,主要体现在目的、功能和使用场景上。

应用场合对比

  • PSDEDATASET

    • 数据提供与聚合:用于对外提供数据集合,支持分页、分组、权限控制。例如,在报表系统中,数据集可以组合多个查询的结果,生成综合视图。
    • 混合数据源:支持从代码表、远程接口或自定义脚本获取数据,适用于集成场景。
    • 业务逻辑封装:通过参数和自定义代码,封装复杂业务逻辑,使前端调用简单。
    • 典型场景:BI 看板、CRM 数据列表、外部数据集成。
  • PSDEDATAQUERY

    • 原子查询:定义基础查询逻辑,如过滤、连接,适用于精确数据检索。
    • 性能优化:通过视图标志和列级别控制,优化查询性能。
    • 可重用性:可以被多个数据集或行为引用,避免重复定义。
    • 典型场景:订单过滤、用户权限查询、多表关联查询。

差异点分析

  • 目的:PSDEDATASET 侧重于数据集合的提供和聚合,而 PSDEDATAQUERY 侧重于原子查询的定义。
  • 功能:数据集支持分页、分组、权限等高级功能,查询则专注于条件 and 连接。
  • 引用关系:数据集通过 PSDEDSDQ 引用查询,但查询可以独立使用或被其他模型引用。
  • 灵活性:查询更灵活,可用于底层数据操作;数据集更面向业务,提供封装后的数据视图。
4. 关系描述与图例

PSDEDATASET 和 PSDEDATAQUERY 通过 PSDEDSDQ 模型关联。PSDEDSDQ 是一个连接模型,它允许一个数据集引用多个数据查询,并定义它们的组合方式(如 UNION 或 UNIONALL)。这种关系使得:

  • 数据聚合:数据集可以合并多个查询的结果,形成综合数据集。
  • 灵活组合:通过更改 PSDEDSDQ 的引用,可以动态调整数据集内容。
  • 性能优化:数据集可以引用优化后的查询,减少重复逻辑。

图例:模型关系图
以下 Mermaid 图展示了 PSDEDATASET、PSDEDATAQUERY 及其相关模型的关系,包括成员模型和连接:

Nested Members
PSDEDATAQUERY Members
PSDEDATASET Members
PSDEDQJOIN
PSDEDQCOND
PSDEDQJOIN
PSDEDQCOND
PSDEDSPARAM
PSDEDSGRPPARAM
PSDEDSDQ
PSDATAENTITY
PSDEDATASET
PSDEDATAQUERY

解释图例

  • PSDATAENTITY 是父模型,PSDEDATASET 和 PSDEDATAQUERY 是其子模型。
  • PSDEDSDQ 作为桥梁,连接 PSDEDATASET 和 PSDEDATAQUERY,表示数据集引用查询。
  • PSDEDSPARAM 和 PSDEDSGRPPARAM 是 PSDEDATASET 的嵌套成员,用于参数和分组。
  • PSDEDQJOIN 和 PSDEDQCOND 是 PSDEDATAQUERY 的嵌套成员,支持查询逻辑。
  • 自嵌套关系(如 PSDEDQJOIN → PSDEDQJOIN)允许复杂查询结构。
  • 颜色区分:PSDEDATASET(粉色)、PSDEDATAQUERY(浅蓝色)、PSDEDSDQ(浅青色)。
5. 实战示例与最佳实践

综合示例:电商订单报表
假设有一个电商系统,需要生成订单报表,包含订单基本信息和产品详情。

  • 步骤1:定义数据查询 PSDEDATAQUERY 用于过滤订单和产品数据。
  • 步骤2:定义数据集 PSDEDATASET,引用这些查询,并启用分组和分页。
  • 步骤3:使用 PSDEDSDQ 连接查询,设置 UNION 模式。

DSL 代码示例:

// 定义实体引用
def de_order = "Demo.ORDER"
def de_product = "Demo.PRODUCT"

// 订单查询
psdedataquery (
  name: "OrderQuery"
  ,codename: "OrderQuery"
  ,psdeid: de_order
  ,logicname: "订单查询"
){
  psdedqjoin (
    name: "MainJoin"
    ,psdejointypeid: "MAIN"
    ,joinpsdeid: de_order
    ,aliasname: "o"
  ){
    psdedqcond (
      name: "StatusFilter"
      ,condtype: "SINGLE"
      ,psdefid: de_order + ".Status"
      ,psdbvalueopid: "EQ"
      ,condvalue: "Completed"
    )
  }
}

// 产品查询
psdedataquery (
  name: "ProductQuery"
  ,codename: "ProductQuery"
  ,psdeid: de_product
  ,logicname: "产品查询"
){
  psdedqjoin (
    name: "MainJoin"
    ,psdejointypeid: "MAIN"
    ,joinpsdeid: de_product
    ,aliasname: "p"
  )
}

// 数据集引用查询
psdedataset (
  name: "OrderReportDataset"
  ,codename: "OrderReportDataset"
  ,psdeid: de_order
  ,logicname: "订单报表数据集"
  ,predefinedtype: "SCRIPT"
  ,retvaltype: "PAGE"
  ,pagesize: 50
  ,unionmode: "UNION"
){
  psdedsdq (
    name: "RefOrderQuery"
    ,psdedqid: de_order + ".OrderQuery"
    ,ordervalue: 1
  )
  psdedsdq (
    name: "RefProductQuery"
    ,psdedqid: de_product + ".ProductQuery"
    ,ordervalue: 2
  )
  psdedsgrpparam (
    name: "GroupByCategory"
    ,aggmode: "GROUP"
    ,psdefid: de_product + ".Category"
    ,groupflag: 1
  )
}

最佳实践

  • 优先使用模式化定义:尽量使用属性 and 枚举,减少自定义代码,提高可维护性。
  • 性能优化:利用 queryviewflagviewcollevel 优化查询。
  • 权限集成:通过 enableuserdr 等属性实现数据安全。
  • 测试与验证:在定义后,通过 iBizModeling Studio 验证模型正确性。
6. 总结

PSDEDATASET 和 PSDEDATAQUERY 是 iBizModel 数据层的核心组件,它们通过分离查询逻辑和数据聚合,提供了高度的灵活性和可维护性。PSDEDATAQUERY 专注于原子查询,支持复杂条件 and joins;PSDEDATASET 则在此基础上构建数据集,支持分组、分页和权限控制。它们的协作通过 PSDEDSDQ 实现,使得企业应用能够高效处理多样化的数据需求,如报表、分析和实时查询。在实际项目中,合理使用这些模型可以显著提升数据层的性能和可扩展性,同时确保数据安全和一致性。最终,这两个模型体现了 iBizModel 的“分离关注点”设计原则,推荐在开发中优先使用模式化定义,减少自定义代码,以保持模型的清晰和可维护性。

Logo

更多推荐