Skip to content

核心概念

本文档介绍 Foggy Dataset Model 的核心概念,帮助你理解 TM、QM 和 DSL 查询的关系。

语义层(Semantic Layer)

Foggy Dataset Model 是一个嵌入式语义层框架,它在数据库和应用层之间提供一个抽象层:

┌─────────────────────────────────────────────────────────┐
│                     应用层 / 前端                        │
│                  (使用 JSON DSL 查询)                    │
└─────────────────────────────────────────────────────────┘
                           ↓ DSL 查询
┌─────────────────────────────────────────────────────────┐
│                    Foggy Dataset Model                   │
│  ┌─────────────┐   ┌─────────────┐   ┌─────────────┐   │
│  │     TM      │ → │     QM      │ → │  Query API  │   │
│  │ (表格模型)   │   │ (查询模型)  │   │ (查询引擎)   │   │
│  └─────────────┘   └─────────────┘   └─────────────┘   │
└─────────────────────────────────────────────────────────┘
                           ↓ SQL
┌─────────────────────────────────────────────────────────┐
│                       数据库                             │
│         MySQL / PostgreSQL / SQL Server / mongo         │
└─────────────────────────────────────────────────────────┘

核心价值

  • 前端无需知道数据库结构,只需按业务语义查询
  • 自动处理多表 JOIN,简化复杂查询
  • 统一权限控制,保障数据安全
  • 屏蔽数据库差异,支持多数据库

TM - 表格模型(Table Model)

TM 是语义层的核心定义文件(.tm),用于描述数据库表的结构和关联关系。

TM 的作用

  1. 表结构映射:将数据库表映射为业务模型
  2. 维度定义:定义与其他表的关联(自动 JOIN)
  3. 度量定义:定义可聚合的数值字段
  4. 属性定义:定义表中的普通字段

TM 的核心概念

事实表(Fact Table)

事实表是业务的核心数据表,存储业务事件记录,如订单、销售、交易等。

javascript
// FactOrderModel.tm
export const model = {
    name: 'FactOrderModel',
    tableName: 'fact_order',      // 事实表
    dimensions: [...],            // 关联的维度
    measures: [...]               // 可聚合的度量
};

维度表(Dimension Table)

维度表存储业务实体的描述信息,如客户、商品、时间等。

javascript
// DimCustomerModel.tm
export const model = {
    name: 'DimCustomerModel',
    tableName: 'dim_customer',    // 维度表
    properties: [...]             // 维度属性
};

维度(Dimension)

维度定义事实表与维度表的关联关系,查询时自动生成 JOIN。

javascript
dimensions: [
    {
        name: 'customer',
        tableName: 'dim_customer',
        foreignKey: 'customer_id',    // 事实表外键
        primaryKey: 'customer_id',    // 维度表主键
        captionColumn: 'customer_name'
    }
]

度量(Measure)

度量是可聚合的数值字段,如销售金额、订单数量等。 注意,虽然这里配置聚合方式为sum,但DSL查询时,还是要加入groupBy或sum函数才可以

javascript
measures: [
    {
        column: 'amount',
        caption: '销售金额',
        type: 'MONEY',
        aggregation: 'sum'    // 默认求和聚合
    }
]

属性(Property)

属性是表中的普通字段,不参与聚合。

javascript
properties: [
    {
        column: 'order_id',
        caption: '订单ID',
        type: 'STRING'
    }
]

QM - 查询模型(Query Model)

QM 是查询视图的定义文件(.qm),基于一个或多个 TM 定义可查询的字段和权限。

QM 的作用

  1. 字段暴露:控制哪些字段可以被查询
  2. 权限控制:控制可以查询的数据
  3. UI 配置:定义字段的显示方式
  4. 默认排序:定义查询的默认排序

QM 的核心概念

列组(Column Groups)

将可查询的字段分组,便于 UI 展示。

javascript
columnGroups: [
    {
        caption: '订单信息',
        items: [
            { name: 'orderId' },
            { name: 'orderStatus' }
        ]
    },
    {
        caption: '客户信息',
        items: [
            { name: 'customer$caption' },   // 维度显示值
            { name: 'customer$customerType' }
        ]
    }
]

DSL 查询

DSL(Domain Specific Language)是用于查询数据的 JSON 格式语言。前端通过 DSL 向 QM 发起查询请求。

DSL 查询流程

┌──────────────┐    JSON DSL    ┌──────────────┐    SQL    ┌──────────────┐
│    前端      │  ───────────→  │   Query API  │  ──────→  │    数据库    │
│  (DSL 查询)  │                │   (QM 引擎)  │           │             │
└──────────────┘                └──────────────┘           └──────────────┘

                                 查询结果 (JSON)

DSL 核心语法

查询列(columns)

指定要查询的字段:

json
{
    "columns": ["orderId", "customer$caption", "amount"]
}

过滤条件(slice)

指定查询条件:

json
{
    "slice": [
        { "field": "orderStatus", "op": "=", "value": "COMPLETED" },
        { "field": "amount", "op": ">=", "value": 100 }
    ]
}

分组(groupBy)

按字段分组聚合:

json
{
    "groupBy": [
        { "field": "customer$customerType" }
    ]
}

排序(orderBy)

指定排序:

json
{
    "orderBy": [
        { "field": "field", "order": "desc" }
    ]
}

字段引用格式

在 DSL 查询中,使用统一的字段引用格式:

格式说明示例
属性名事实表属性orderId, orderStatus
度量名度量字段amount, quantity
维度名$caption维度显示值customer$caption
维度名$id维度 IDcustomer$id
维度名$属性名维度属性customer$customerType

示例

json
{
    "columns": [
        "orderId",              // 事实表属性
        "amount",          // 度量
        "customer$caption",     // 客户名称
        "customer$province",    // 客户省份
        "orderDate$year"        // 订单年份
    ]
}

TM、QM、DSL 的关系

┌────────────────────────────────────────────────────────────────┐
│                          TM (表格模型)                          │
│  ┌──────────────┐    ┌──────────────┐    ┌──────────────┐     │
│  │ FactOrder.tm │    │ DimCustomer.tm│    │ DimProduct.tm│     │
│  └──────────────┘    └──────────────┘    └──────────────┘     │
│         ↓                   ↓                   ↓              │
│         └───────────────────┴───────────────────┘              │
│                            ↓                                   │
│                    ┌──────────────┐                           │
│                    │   QM (查询模型)│                           │
│                    │ OrderQuery.qm│                           │
│                    └──────────────┘                           │
│                            ↓                                   │
│                    ┌──────────────┐                           │
│                    │  DSL 查询请求 │                           │
│                    │   (JSON)     │                           │
│                    └──────────────┘                           │
└────────────────────────────────────────────────────────────────┘
  1. TM 定义数据结构:表、字段、关联关系
  2. QM 定义查询视图:基于 TM,定义可查询的内容和权限
  3. DSL 发起查询:基于 QM,使用 JSON 格式查询数据

模型类型

星型模型(Star Schema)

事实表直接关联维度表,查询时自动生成一层 JOIN。

                    ┌─────────────┐
                    │ dim_customer│
                    └──────┬──────┘

┌─────────────┐    ┌───────┴───────┐    ┌─────────────┐
│ dim_product │────│  fact_order   │────│  dim_date   │
└─────────────┘    └───────────────┘    └─────────────┘

雪花模型(Snowflake Schema)

维度表可以继续关联子维度表,形成多层结构。

                    ┌─────────────┐
                    │ dim_category│
                    └──────┬──────┘

                    ┌──────┴──────┐
                    │ dim_product │
                    └──────┬──────┘

                    ┌──────┴──────┐
                    │ fact_order  │
                    └─────────────┘

父子维度(Parent-Child Dimension)

用于处理层级结构数据,如组织架构、商品分类等。通过闭包表实现高效的层级查询。

向量模型(Vector Model)

用于与 Milvus 等向量数据库集成,支持语义相似度检索。

┌─────────────────────────────────────────────────────────────┐
│                      向量模型架构                             │
│                                                              │
│  ┌──────────────┐    Embedding    ┌──────────────┐          │
│  │   搜索文本    │  ───────────→   │   向量数据库   │          │
│  │ "销售分析"   │                 │   (Milvus)    │          │
│  └──────────────┘                 └──────────────┘          │
│                                          ↓                   │
│                                   相似度检索结果              │
│                                   (含 _score 字段)           │
└─────────────────────────────────────────────────────────────┘

特点

  • 自动将文本转换为向量进行语义检索
  • 支持 similar(相似度搜索)和 hybrid(混合搜索)
  • 向量字段元数据自动从 Milvus 获取

下一步