Files
WCTDataMiner/docs/data-model/概览.md
ssss 28cb2533a7 docs: 完善数据模型设计
- 重命名 log_file 为 test_scenario(测试场景)
- 拆分维度表:tx_panel、tx_hardware、tx_software、rx_type
- 采用星型模型设计,消除数据冗余
- 为所有表添加软删除字段 is_deleted
- 更新关系说明,包含全局查询过滤器配置
- 更新 ER 图和查询示例

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 15:53:30 +08:00

5.7 KiB
Raw Blame History

Data Model: WCTDataMiner

WCTDataMiner 数据库模型规格,采用维度表设计,消除数据冗余


文档索引

维度表

文档 说明
TX面板维度 TX面板类型维度
TX硬件版本维度 TX硬件版本维度
TX软件版本维度 TX软件版本维度
RX类型维度 RX类型维度

事实表

文档 说明
测试场景实体 测试场景(外键组合)
Qfod 记录实体 Qfod 检测数据
Ploss 记录实体 Ploss FOD 数据
关系说明 实体间关系定义

实体列表

维度表4张

表名 职责 关键字段
tx_panel TX面板类型维度 name (UNIQUE)
tx_hardware TX硬件版本维度 version (UNIQUE)
tx_software TX软件版本维度 version (UNIQUE)
rx_type RX类型维度 name (UNIQUE)

事实表3张

表名 职责 关键字段
test_scenario 测试场景组合 4个维度外键 + test_purpose + test_date
qfod_record Qfod 检测数据 scenario_id, delta_q, fod_type
ploss_record Ploss FOD 数据 scenario_id, ploss, threshold

ER 关系图

erDiagram
    tx_panel ||--o{ test_scenario : "引用"
    tx_hardware ||--o{ test_scenario : "引用"
    tx_software ||--o{ test_scenario : "引用"
    rx_type ||--o{ test_scenario : "引用"
    
    test_scenario ||--o{ qfod_record : "包含"
    test_scenario ||--o{ ploss_record : "包含"

    tx_panel {
        uuid id PK "主键"
        varchar name UK "面板类型"
    }
    
    tx_hardware {
        uuid id PK "主键"
        varchar version UK "硬件版本"
    }
    
    tx_software {
        uuid id PK "主键"
        varchar version UK "软件版本"
    }
    
    rx_type {
        uuid id PK "主键"
        varchar name UK "RX类型"
    }
    
    test_scenario {
        uuid id PK "主键"
        uuid tx_panel_id FK "面板外键"
        uuid tx_hardware_id FK "硬件外键"
        uuid tx_software_id FK "软件外键"
        uuid rx_type_id FK "RX外键"
        varchar test_purpose "测试目的"
        date test_date "测试日期"
        int test_sequence "测试序号"
        int qfod_count "Qfod记录数"
        int ploss_count "Ploss记录数"
    }
    
    qfod_record {
        uuid id PK "主键"
        uuid scenario_id FK "场景外键"
        tinyint charger_index "充电器索引"
        tinyint coil_index "线圈索引"
        int delta_q "Q值变化量"
        float current_q "当前Q值"
        float raw_q "原始Q值"
        tinyint fod_type "异物类型"
    }
    
    ploss_record {
        uuid id PK "主键"
        uuid scenario_id FK "场景外键"
        tinyint rx_type "接收端类型"
        smallint rx_power "接收端功率"
        smallint tx_power "发射端功率"
        int ploss "计算损耗值"
        int threshold "阈值"
        smallint fod_result "FOD判定结果"
    }

设计说明

星型模型架构

本设计采用星型模型Star Schema

  • 维度表存储可能重复的属性值面板、硬件版本、软件版本、RX类型
  • 事实表:存储外键组合和度量数据

优势

  • 维度值只存一份,消除冗余
  • 维度可复用,相同硬件版本在不同场景中引用同一记录
  • 查询可按维度灵活筛选和分组

test_purpose 处理

test_purpose 直接存储在场景表中,不拆分维度表,原因:

  • 测试目的描述较自由,不适合标准化为维度
  • 便于用户灵活输入

场景唯一性

场景表设置唯一约束,相同属性组合不重复创建:

UNIQUE(tx_panel_id, tx_hardware_id, tx_software_id, rx_type_id, test_purpose, test_date, test_sequence)

软删除设计

所有表均包含 is_deleted 字段,支持软删除:

字段名 类型 约束 说明
is_deleted BOOLEAN NOT NULL, DEFAULT FALSE 软删除标记

删除行为

  • 删除操作设置 is_deleted = true,不物理删除数据
  • 查询时默认过滤已删除记录(WHERE is_deleted = false
  • 支持数据恢复和审计追溯

查询示例

// 默认查询(不含已删除)
var activeRecords = context.TxPanels
    .Where(t => !t.IsDeleted)
    .ToList();

// 包含已删除记录
var allRecords = context.TxPanels
    .IgnoreQueryFilters()
    .ToList();

// 软删除操作
public async Task SoftDeleteAsync(Guid id)
{
    var entity = await context.TxPanels.FindAsync(id);
    if (entity != null)
    {
        entity.IsDeleted = true;
        await context.SaveChangesAsync();
    }
}

系统日志处理

解析过程中的错误日志通过 Serilog 记录到系统日志文件,不存入业务数据库。


数据量估算

增长方式 预估规模
tx_panel 预置数据 7 条(固定枚举)
tx_hardware 随版本迭代 10-50 条/年
tx_software 随版本迭代 10-50 条/年
rx_type 随设备增加 20-100 条/年
test_scenario 随测试批次 3,650 条/年
qfod_record 随测试数据 3.6M-18M 条/年
ploss_record 随测试数据 3.6M-18M 条/年

假设/歧义标注

标注 内容
[A] 使用 UUID 作为主键
[?] FOD Type 具体编码含义需确认
[?] Ploss 日志格式与实际日志对应关系需确认
[!] ploss 负数表示安全,正数可能触发 FOD