iBizModel 实体数据集(PSDEDATASET)与实体数据查询(PSDEDATAQUERY)模型详解
摘要 iBizModel 数据层核心包含实体数据集(PSDEDATASET)和实体数据查询(PSDEDATAQUERY)两大模型。PSDEDATASET 作为数据提供者,支持多源数据聚合(代码表、远程接口、自定义脚本等),具备分页、分组、权限控制等特性,适用于报表生成、数据看板等复杂场景。PSDEDATAQUERY 定义原子查询逻辑,支持条件过滤、多表连接和性能优化,是数据检索的基础单元。二者通过
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
模式合并数据,并启用分组统计销售额。 - 数据看板:使用分组和聚合模式(如按部门统计销售额),通过
enablegroup
和PSDEDSGRPPARAM
实现。 - 权限管理:启用用户数据范围(
enableuserdr
),确保用户只能访问自己的数据,如 CRM 系统中的客户数据。 - 外部集成:通过
REMOTE
类型从外部服务获取数据,支持微服务架构,如从第三方 API 获取天气数据。 - 高性能查询:使用
predefinedtype
为INDEXDE
或DELOGIC
,优化查询性能。
成员模型:
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 适用于需要精确数据检索的场景:
- 过滤查询:如根据状态、时间范围过滤订单数据。例如,定义一个查询过滤状态为 “已完成” 的订单。
- 多表关联:通过连接查询获取相关实体数据,如订单关联产品信息,使用
PSDEDQJOIN
的N1
类型。 - 权限过滤:结合用户上下文添加条件,如只查询当前用户创建的数据,使用
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 及其相关模型的关系,包括成员模型和连接:
解释图例:
- 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 枚举,减少自定义代码,提高可维护性。
- 性能优化:利用
queryviewflag
和viewcollevel
优化查询。 - 权限集成:通过
enableuserdr
等属性实现数据安全。 - 测试与验证:在定义后,通过 iBizModeling Studio 验证模型正确性。
6. 总结
PSDEDATASET 和 PSDEDATAQUERY 是 iBizModel 数据层的核心组件,它们通过分离查询逻辑和数据聚合,提供了高度的灵活性和可维护性。PSDEDATAQUERY 专注于原子查询,支持复杂条件 and joins;PSDEDATASET 则在此基础上构建数据集,支持分组、分页和权限控制。它们的协作通过 PSDEDSDQ 实现,使得企业应用能够高效处理多样化的数据需求,如报表、分析和实时查询。在实际项目中,合理使用这些模型可以显著提升数据层的性能和可扩展性,同时确保数据安全和一致性。最终,这两个模型体现了 iBizModel 的“分离关注点”设计原则,推荐在开发中优先使用模式化定义,减少自定义代码,以保持模型的清晰和可维护性。
更多推荐
所有评论(0)