# 患者检查数据仓库建表说明 ## 📁 文件说明 | 文件 | 说明 | |------|------| | `01_create_ods_tables.sql` | ODS 层(原始数据层)建表语句 | | `02_create_dwd_tables.sql` | DWD 层(明细数据层)建表语句 | | `03_create_ads_tables.sql` | ADS 层(应用数据层)建表语句 | ## 🗄️ 表结构概览 ### ODS 层(原始数据层) MySQL 原表的镜像,结构完全一致,加 `ods_` 前缀: | 表名 | 说明 | 同步频率 | |------|------|---------| | `ods_patient_custome` | 患者表 | 每天增量 | | `ods_clinic_clinic` | 就诊表 | 每天增量 | | `ods_exam_examresult` | 检查结果表 | 每天增量 | | `ods_treat_sellgoods` | 取镜记录表 | 每天增量 | | `ods_material_goods` | 商品表 | 每天全量 | | `ods_fee_order` | 订单表 | 每天增量 | | `ods_fee_orderdetail` | 订单明细表 | 每天增量 | | `ods_staff_staff` | 员工表 | 每天全量 | | `ods_org_org` | 机构表 | 每天全量 | **字段说明**: - 所有表都有 `create_time` 和 `update_time`(Doris 记录) - `source_create_time` 和 `source_update_time`(MySQL 源表时间) ### DWD 层(明细数据层) | 表名 | 说明 | 生成方式 | |------|------|---------| | `fact_patient_exam_detail` | 患者就诊明细事实表 | Doris 内部关联 ODS 表 | **数据来源**: - `ods_clinic_clinic`(就诊记录) - `ods_patient_custome`(患者信息) - `ods_exam_examresult`(检查结果) - `ods_treat_sellgoods`(取镜记录) - `ods_material_goods`(商品信息) - `ods_fee_order`(订单信息) - `ods_staff_staff`(员工信息) - `ods_org_org`(机构信息) ### ADS 层(应用数据层) | 表名 | 说明 | 生成方式 | |------|------|---------| | `fact_patient_exam_wide` | 患者检查周期宽表 | Doris 内部计算 DWD 表 | **宽表结构**: - 以末次取镜时间为中心点 - 包含基线、前后多个周期的检查数据 - 每个患者每天一条记录(按末次取镜日期) ## 🚀 使用步骤 ### 1. 创建表 ```bash # 连接 Doris mysql -h 127.0.0.1 -P 9030 -u root -p # 使用数据库 USE bolin_prd; # 按顺序执行建表语句 source sql/patient_exam/01_create_ods_tables.sql source sql/patient_exam/02_create_dwd_tables.sql source sql/patient_exam/03_create_ads_tables.sql ``` ### 2. 验证表结构 ```sql -- 查看 ODS 层表 SHOW TABLES LIKE 'ods_%'; -- 查看 DWD 层表 SHOW TABLES LIKE 'fact_patient_exam_detail'; -- 查看 ADS 层表 SHOW TABLES LIKE 'fact_patient_exam_wide'; -- 查看表结构 DESC ods_patient_custome; DESC fact_patient_exam_detail; DESC fact_patient_exam_wide; ``` ### 3. 启动同步任务 ```bash # 进入项目目录 cd E:\公司\BI1.0\doris_sync # 查看任务列表 python main.py jobs # 手动运行 ODS 层同步(测试) python main.py run ods_patient_exam_sync ``` ## 📊 字段命名规范 所有表都遵循以下规范: | 字段类型 | 命名规则 | 示例 | |---------|---------|------| | 主键 | `id` | `id` | | 业务ID | `xxx_id` | `patient_id`, `clinic_id` | | 名称 | `xxx_name` | `patient_name`, `org_name` | | 金额 | `xxx_amt` | `pay_amt`, `total_amt` | | 数量 | `xxx_cnt` | `buy_cnt`, `refund_cnt` | | 日期 | `xxx_date` | `come_date`, `pickup_date` | | 时间 | `xxx_time` | `create_time`, `update_time` | | 值 | `xxx_val` | `right_se_val`, `al_od_val` | | 标识 | `is_xxx` | `is_both_bs_xq` | | 类型 | `xxx_type` | `visit_type`, `fee_class` | 所有表都有 `create_time` 和 `update_time` 字段。 ## ⚙️ 配置说明 ### 数据同步策略 - **ODS 层**:每天凌晨1点,增量同步昨天的数据 - **DWD 层**:每天凌晨2点,在 Doris 内部关联生成 - **ADS 层**:每天凌晨3点,增量更新;每周日凌晨3点,更新最近90天;每月1号凌晨4点,全量重建 ### 分区策略(可选) 当数据量增大时,可以对 `fact_patient_exam_wide` 表进行分区: ```sql -- 按数据日期(末次取镜日期)分区 ALTER TABLE fact_patient_exam_wide ADD PARTITION BY RANGE(`data_date`) ( PARTITION p202401 VALUES LESS THAN ('2024-02-01'), PARTITION p202402 VALUES LESS THAN ('2024-03-01'), PARTITION p202403 VALUES LESS THAN ('2024-04-01'), PARTITION p202404 VALUES LESS THAN ('2024-05-01') ); ``` ### Rollup 优化(可选) 为常用查询创建 Rollup 提升性能: ```sql ALTER TABLE fact_patient_exam_wide ADD ROLLUP recent_data ( patient_id, patient_name, mobile, baseline_right_se_val, baseline_left_se_val, p3_right_se_val, p3_left_se_val, p6_right_se_val, p6_left_se_val ); ``` ## 🔍 常用查询 ```sql -- 查询某个患者的检查数据 SELECT * FROM fact_patient_exam_wide WHERE patient_id_str = 'P123456'; -- 查询最近取镜的患者 SELECT * FROM fact_patient_exam_wide ORDER BY last_pickup_time DESC LIMIT 100; -- 查询某个收费分类的患者 SELECT * FROM fact_patient_exam_wide WHERE fee_class = '离焦镜片' AND last_pickup_date >= '2024-01-01'; -- 统计基线数据完整度 SELECT COUNT(*) as total_cnt, COUNT(baseline_right_se_val) as has_baseline_se_cnt, COUNT(baseline_al_od_val) as has_baseline_al_cnt, COUNT(*) - COUNT(baseline_right_se_val) as missing_baseline_se_cnt FROM fact_patient_exam_wide WHERE last_pickup_date >= '2024-01-01'; ```