# CNC机床数据采集系统 - 数据库设计文档 > 最后更新:2026-04-28 > 状态:定稿(界面设计已全部确认,数据库结构已落地) --- ## 一、数据库架构 - **业务库**:cnc_business - **日志库**:cnc_log - **引擎**:InnoDB,字符集 utf8mb4,排序 utf8mb4_unicode_ci - **分区策略**:高写入表按月分区,定期创建新分区+删除过期分区 --- ## 二、业务库 cnc_business(17张表) ### 2.1 车间表 cnc_workshop ``sql CREATE TABLE cnc_workshop ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL UNIQUE, sort_order INT NOT NULL DEFAULT 0, is_enabled TINYINT(1) NOT NULL DEFAULT 1, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车间表'; `` 无额外索引。3个车间,数据量极小,主键足够。 --- ### 2.2 品牌模板表 cnc_brand ``sql CREATE TABLE cnc_brand ( id INT AUTO_INCREMENT PRIMARY KEY, brand_name VARCHAR(50) NOT NULL UNIQUE, device_field VARCHAR(50) NOT NULL DEFAULT 'device', tags_path VARCHAR(100) NOT NULL DEFAULT 'tags', is_enabled TINYINT(1) NOT NULL DEFAULT 1, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='CNC品牌模板表'; `` 所有品牌顶层结构统一,device_field和tags_path默认值覆盖绝大多数品牌。品牌数量少,无额外索引。 --- ### 2.3 品牌字段映射表 cnc_brand_field_mapping ``sql CREATE TABLE cnc_brand_field_mapping ( id INT AUTO_INCREMENT PRIMARY KEY, brand_id INT NOT NULL, standard_field VARCHAR(50) NOT NULL, field_name VARCHAR(50) NOT NULL, match_by VARCHAR(20) NOT NULL DEFAULT 'id', data_type VARCHAR(20) NOT NULL DEFAULT 'string', is_required TINYINT(1) NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (brand_id) REFERENCES cnc_brand(id) ON DELETE CASCADE, UNIQUE KEY uk_brand_standard (brand_id, standard_field) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='品牌字段映射表'; `` **标准字段约定**(代码层面,不建表): | standard_field | 含义 | data_type | |----------------|------|-----------| | program_name | NC程序名 | string | | part_count | 当前加工零件数 | number | | device_status | 设备状态 | number | | run_status | 运行状态 | number | | operate_mode | 操作模式 | number | | spindle_speed_set | 主轴设定速度 | number | | feed_speed_set | 进给设定速度 | number | | spindle_speed_actual | 主轴实际速度 | number | | feed_speed_actual | 进给实际转速 | number | | spindle_load | 主轴负载 | number | | spindle_override | 主轴倍率 | number | | power_on_time | 开机时间 | number | | run_time | 运行时间 | number | | cutting_time | 切削时间 | number | | cycle_time | 循环时间 | number | | machining_status | 加工状态 | string | 索引:uk_brand_standard唯一约束同时作为索引,保证同一品牌下标准字段不重复,采集时按brand_id查询所有映射规则。 --- ### 2.4 采集地址表 cnc_collect_address ``sql CREATE TABLE cnc_collect_address ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, url VARCHAR(500) NOT NULL, brand_id INT NOT NULL, collect_interval INT NOT NULL DEFAULT 30, is_enabled TINYINT(1) NOT NULL DEFAULT 1, last_collect_time DATETIME NULL, last_collect_status VARCHAR(20) NULL, fail_count INT NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (brand_id) REFERENCES cnc_brand(id), INDEX idx_brand (brand_id), INDEX idx_enabled (is_enabled) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采集地址表'; `` 索引:idx_brand用于采集服务按品牌加载地址列表;idx_enabled用于只查启用的地址。last_collect_time/status/fail_count由采集服务实时更新,大屏和管理后台直接查此表显示采集状态。 --- ### 2.5 机床表 cnc_machine ``sql CREATE TABLE cnc_machine ( id INT AUTO_INCREMENT PRIMARY KEY, device_code VARCHAR(100) NOT NULL, name VARCHAR(100) NOT NULL, workshop_id INT NOT NULL, collect_address_id INT NOT NULL, ip_address VARCHAR(50) NOT NULL, brand_id INT NOT NULL, is_enabled TINYINT(1) NOT NULL DEFAULT 1, is_online TINYINT(1) NOT NULL DEFAULT 0, last_ping_time DATETIME NULL, last_collect_time DATETIME NULL, last_device_status VARCHAR(20) NULL, last_run_status VARCHAR(20) NULL, last_program_name VARCHAR(200) NULL, last_part_count DECIMAL(15,5) NULL, last_operate_mode VARCHAR(20) NULL, last_machining_status VARCHAR(20) NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (workshop_id) REFERENCES cnc_workshop(id), FOREIGN KEY (collect_address_id) REFERENCES cnc_collect_address(id), FOREIGN KEY (brand_id) REFERENCES cnc_brand(id), UNIQUE KEY uk_device_code (device_code), INDEX idx_workshop (workshop_id), INDEX idx_collect_address (collect_address_id), INDEX idx_enabled_online (is_enabled, is_online), INDEX idx_enabled_address (is_enabled, collect_address_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='CNC机床表'; `` 索引设计: - uk_device_code:采集时用device值匹配机床,唯一约束防重复 - idx_workshop:按车间筛选机床 - idx_enabled_online:大屏查在线+可用机床列表,高频查询 - idx_enabled_address:采集服务按地址查启用的机床列表 实时状态字段:故意冗余到机床表,大屏和首页查询只读此表,不JOIN采集记录表,避免高频查询大表。 --- ### 2.6 工人表 cnc_worker ``sql CREATE TABLE cnc_worker ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, code VARCHAR(50) NOT NULL UNIQUE, is_enabled TINYINT(1) NOT NULL DEFAULT 1, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工人表'; `` 工人不归属车间。uk_code覆盖工号查询。 --- ### 2.7 工人-机床绑定表 cnc_worker_machine ``sql CREATE TABLE cnc_worker_machine ( id INT AUTO_INCREMENT PRIMARY KEY, worker_id INT NOT NULL, machine_id INT NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (worker_id) REFERENCES cnc_worker(id) ON DELETE CASCADE, FOREIGN KEY (machine_id) REFERENCES cnc_machine(id) ON DELETE CASCADE, UNIQUE KEY uk_machine (machine_id), INDEX idx_worker (worker_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工人-机床绑定表'; `` 索引:uk_machine保证一对一绑定,同时作为按机床查工人的索引;idx_worker用于按工人查机床列表。 --- ### 2.8 采集结构化记录表 cnc_collect_record(按月分区,高频写入) ``sql CREATE TABLE cnc_collect_record ( id BIGINT AUTO_INCREMENT, machine_id INT NOT NULL, collect_time DATETIME NOT NULL, device_time DATETIME NULL, program_name VARCHAR(200) NULL, part_count DECIMAL(15,5) NULL, device_status VARCHAR(20) NULL, run_status VARCHAR(20) NULL, operate_mode VARCHAR(20) NULL, spindle_speed_set DECIMAL(15,5) NULL, feed_speed_set DECIMAL(15,5) NULL, spindle_speed_actual DECIMAL(15,5) NULL, feed_speed_actual DECIMAL(15,5) NULL, spindle_load DECIMAL(15,5) NULL, spindle_override DECIMAL(5,2) NULL, power_on_time DECIMAL(15,2) NULL, run_time DECIMAL(15,2) NULL, cutting_time DECIMAL(15,2) NULL, cycle_time DECIMAL(15,2) NULL, machining_status VARCHAR(20) NULL, extra_data JSON NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id, collect_time), INDEX idx_machine_time (machine_id, collect_time), INDEX idx_collect_time (collect_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采集结构化记录表(按月分区,90天自动清理)' PARTITION BY RANGE (TO_DAYS(collect_time)) ( PARTITION p202604 VALUES LESS THAN (TO_DAYS('2026-05-01')), PARTITION p202605 VALUES LESS THAN (TO_DAYS('2026-06-01')), PARTITION p202606 VALUES LESS THAN (TO_DAYS('2026-07-01')), PARTITION p_future VALUES LESS THAN MAXVALUE ); `` 索引设计: - idx_machine_time:最核心索引,覆盖查某台机床某时间段采集数据(报表、趋势图、日汇总计算) - idx_collect_time:覆盖查某个时间点所有机床数据(全局状态快照) 分区策略:按月分区,删除过期数据只需DROP PARTITION,避免DELETE大量行导致锁表和碎片。 数据量估算:160台 x 每天约2000条 = 32万/天,90天约2900万行。分区后单分区约300万行。 --- ### 2.9 产量分段记录表 cnc_production_segment ``sql CREATE TABLE cnc_production_segment ( id BIGINT AUTO_INCREMENT PRIMARY KEY, machine_id INT NOT NULL, program_name VARCHAR(200) NOT NULL, production_date DATE NOT NULL, start_time DATETIME NOT NULL, end_time DATETIME NULL, start_part_count DECIMAL(15,5) NOT NULL, end_part_count DECIMAL(15,5) NULL, quantity DECIMAL(15,5) NULL, is_settled TINYINT(1) NOT NULL DEFAULT 0, close_reason VARCHAR(30) NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (machine_id) REFERENCES cnc_machine(id), INDEX idx_machine_date (machine_id, production_date), INDEX idx_machine_date_program (machine_id, production_date, program_name), INDEX idx_active (machine_id, is_settled, end_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产量分段记录表'; `` 核心逻辑:每次采集检测到以下情况时结账当前段并开新段: 1. NC程序名变化 -> close_reason = 'program_change' 2. 同程序下part_count下降 -> close_reason = 'manual_reset' 3. 日终汇总时仍在运行 -> close_reason = 'end_of_day' 4. 采集服务停止时 -> close_reason = 'service_stop' A-B-C-A-B场景:程序A第二次出现时创建新的段记录,日汇总按(machine_id, production_date, program_name)合并。 索引设计: - idx_machine_date:日汇总计算时查某台机床某天的所有段 - idx_machine_date_program:查某台机床某天某个程序的所有段(合并计算) - idx_active:采集服务运行时快速查找当前活跃段(is_settled=0, end_time IS NULL) --- ### 2.10 机床日状态表 cnc_machine_daily_status ``sql CREATE TABLE cnc_machine_daily_status ( id INT AUTO_INCREMENT PRIMARY KEY, machine_id INT NOT NULL, production_date DATE NOT NULL, data_status VARCHAR(20) NOT NULL DEFAULT 'normal', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (machine_id) REFERENCES cnc_machine(id), UNIQUE KEY uk_machine_date (machine_id, production_date), INDEX idx_date_status (production_date, data_status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='机床日状态表'; `` data_status规则: - normal:当天至少成功采集过一次 - offline:当天从未Ping通,产量=0 - data_missing:Ping通但采集始终失败,前端显示-而非0 索引:uk_machine_date保证每台机床每天只有一条状态记录;idx_date_status支持按天查特定状态机床。 --- ### 2.11 日汇总表 cnc_daily_production(按机床+程序) ``sql CREATE TABLE cnc_daily_production ( id INT AUTO_INCREMENT PRIMARY KEY, machine_id INT NOT NULL, production_date DATE NOT NULL, program_name VARCHAR(200) NOT NULL, total_quantity DECIMAL(15,5) NOT NULL DEFAULT 0, segment_count INT NOT NULL DEFAULT 1, total_run_time DECIMAL(15,2) NULL, total_cutting_time DECIMAL(15,2) NULL, total_cycle_time DECIMAL(15,2) NULL, is_adjusted TINYINT(1) NOT NULL DEFAULT 0, adjusted_quantity DECIMAL(15,5) NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (machine_id) REFERENCES cnc_machine(id), UNIQUE KEY uk_machine_date_program (machine_id, production_date, program_name), INDEX idx_date (production_date), INDEX idx_date_program (production_date, program_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='日汇总表(按机床+程序)'; `` 索引设计: - uk_machine_date_program:唯一约束+最核心查询索引 - idx_date:按日期查所有汇总 - idx_date_program:按日期+程序名查汇总 --- ### 2.12 工人日汇总表 cnc_worker_daily_summary ``sql CREATE TABLE cnc_worker_daily_summary ( id INT AUTO_INCREMENT PRIMARY KEY, worker_id INT NOT NULL, production_date DATE NOT NULL, total_quantity DECIMAL(15,5) NOT NULL DEFAULT 0, machine_count INT NOT NULL DEFAULT 0, program_count INT NOT NULL DEFAULT 0, is_adjusted TINYINT(1) NOT NULL DEFAULT 0, adjusted_quantity DECIMAL(15,5) NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (worker_id) REFERENCES cnc_worker(id) ON DELETE CASCADE, UNIQUE KEY uk_worker_date (worker_id, production_date), INDEX idx_date (production_date), INDEX idx_date_quantity (production_date, total_quantity) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工人日汇总表'; `` 索引设计: - uk_worker_date:唯一约束+核心查询 - idx_date:按日期查所有工人汇总 - idx_date_quantity:排行榜核心索引,按日期查产量排名,覆盖大屏排行榜高频查询 --- ### 2.13 产量修正审计表 cnc_production_adjustment ``sql CREATE TABLE cnc_production_adjustment ( id BIGINT AUTO_INCREMENT PRIMARY KEY, target_table VARCHAR(30) NOT NULL, target_id INT NOT NULL, field_name VARCHAR(50) NOT NULL, old_value DECIMAL(15,5) NULL, new_value DECIMAL(15,5) NOT NULL, reason VARCHAR(500) NOT NULL, operator_ip VARCHAR(50) NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, INDEX idx_target (target_table, target_id), INDEX idx_created (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='产量修正审计表'; `` 索引:idx_target用于查某条记录的修正历史;idx_created用于按时间查审计日志。 --- ### 2.14 告警表 cnc_alert ``sql CREATE TABLE cnc_alert ( id BIGINT AUTO_INCREMENT PRIMARY KEY, alert_type VARCHAR(30) NOT NULL, machine_id INT NULL, collect_address_id INT NULL, title VARCHAR(200) NOT NULL, detail TEXT NULL, is_resolved TINYINT(1) NOT NULL DEFAULT 0, resolved_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (machine_id) REFERENCES cnc_machine(id) ON DELETE SET NULL, FOREIGN KEY (collect_address_id) REFERENCES cnc_collect_address(id) ON DELETE SET NULL, INDEX idx_type_resolved (alert_type, is_resolved), INDEX idx_machine_time (machine_id, created_at), INDEX idx_created (created_at), INDEX idx_unresolved (is_resolved, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='告警表'; `` 告警类型:collect_fail / device_offline / production_anomaly / unknown_device / service_error 索引设计: - idx_type_resolved:按类型查未处理告警 - idx_machine_time:查某台机床的告警历史 - idx_unresolved:管理后台最常用查询,查所有未处理告警按时间排序 --- ### 2.15 系统配置表 cnc_sys_config ``sql CREATE TABLE cnc_sys_config ( id INT AUTO_INCREMENT PRIMARY KEY, config_key VARCHAR(100) NOT NULL UNIQUE, config_value TEXT NOT NULL, value_type VARCHAR(20) NOT NULL DEFAULT 'string', description VARCHAR(200) NULL, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统配置表'; `` 预置配置项: | config_key | 默认值 | 说明 | |------------|--------|------| | ping_interval | 60 | Ping检测间隔(秒) | | collect_retry_count | 3 | 采集失败重试次数 | | collect_retry_interval | 30 | 采集重试间隔(秒) | | collect_fail_alert_threshold | 5 | 连续失败N次触发告警 | | heartbeat_interval | 10 | 心跳写入间隔(秒) | | daily_summary_time | 01:00 | 日终汇总执行时间 | | config_poll_interval | 30 | 采集服务轮询配置间隔(秒) | | log_retention_days | 90 | 原始采集日志保留天数 | | system_log_retention_days | 30 | 系统日志保留天数 | | alert_log_retention_days | 180 | 异常日志保留天数 | | heartbeat_retention_days | 7 | 心跳记录保留天数 | | bigscreen_refresh_interval | 10 | 大屏刷新间隔(秒) | | api_token | (自动生成) | 前端API Token | | collector_api_port | 5800 | 采集服务管理API端口 | | collector_api_key | (自动生成) | 采集服务间通信API Key | | error_retry_base_interval | 60 | 任务错误重试基础间隔(秒) | | admin_username | admin | 管理员用户名(不可修改) | | admin_password_hash | (bcrypt hash of admin123) | 管理员密码哈希 | --- ### 2.16 大屏配置表 cnc_screen_config ``sql CREATE TABLE cnc_screen_config ( id INT AUTO_INCREMENT PRIMARY KEY, card_key VARCHAR(50) NOT NULL UNIQUE, card_type VARCHAR(30) NOT NULL, title VARCHAR(100) NOT NULL, metric VARCHAR(50) NOT NULL, dimension VARCHAR(30) NULL, sort_order INT NOT NULL DEFAULT 0, is_enabled TINYINT(1) NOT NULL DEFAULT 1, chart_config JSON NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='大屏卡片配置表'; `` card_type类型:stat_number / bar_chart / line_chart / pie_chart / status_grid / rank_list 预置卡片: | card_key | card_type | title | metric | dimension | |----------|-----------|-------|--------|-----------| | total_online | stat_number | 在线机床数 | online_count | - | | total_production_today | stat_number | 今日总产量 | part_count | - | | workshop_production | bar_chart | 各车间产量 | part_count | workshop | | worker_rank | rank_list | 工人产量排行 | part_count | worker | | machine_rank | rank_list | 机床产量排行 | part_count | machine | | machine_status | status_grid | 机床状态总览 | - | - | | collector_status | stat_number | 采集服务状态 | - | - | | production_trend | line_chart | 产量趋势(7天) | part_count | - | --- ### 2.17 大屏筛选配置表 cnc_screen_filter ``sql CREATE TABLE cnc_screen_filter ( id INT AUTO_INCREMENT PRIMARY KEY, screen_key VARCHAR(50) NOT NULL, filter_type VARCHAR(30) NOT NULL, filter_value VARCHAR(100) NOT NULL, is_default TINYINT(1) NOT NULL DEFAULT 0, sort_order INT NOT NULL DEFAULT 0, UNIQUE KEY uk_screen_filter (screen_key, filter_type, filter_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='大屏筛选配置表'; `` --- ## 三、日志库 cnc_log(3张表) ### 3.1 原始采集JSON表 log_collect_raw(按月分区) ``sql CREATE TABLE log_collect_raw ( id BIGINT AUTO_INCREMENT, collect_address_id INT NOT NULL, request_time DATETIME NOT NULL, response_time DATETIME NOT NULL, response_duration INT NULL, is_success TINYINT(1) NOT NULL DEFAULT 1, status_code INT NULL, raw_json MEDIUMTEXT NOT NULL, error_message VARCHAR(500) NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id, request_time), INDEX idx_address_time (collect_address_id, request_time), INDEX idx_request_time (request_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='原始采集JSON表(按月分区,90天自动清理)' PARTITION BY RANGE (TO_DAYS(request_time)) ( PARTITION p202604 VALUES LESS THAN (TO_DAYS('2026-05-01')), PARTITION p202605 VALUES LESS THAN (TO_DAYS('2026-06-01')), PARTITION p202606 VALUES LESS THAN (TO_DAYS('2026-07-01')), PARTITION p_future VALUES LESS THAN MAXVALUE ); `` 数据量估算:每30秒一次采集 x 5-10个地址 x 86400秒/天 = 1.4-2.9万条/天,每条约20KB = 280-580MB/天。90天约25-52GB。 --- ### 3.2 系统日志表 log_system(按月分区) ``sql CREATE TABLE log_system ( id BIGINT AUTO_INCREMENT, log_level VARCHAR(10) NOT NULL, source VARCHAR(50) NOT NULL, message TEXT NOT NULL, stack_trace TEXT NULL, extra_data JSON NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id, created_at), INDEX idx_level_time (log_level, created_at), INDEX idx_source_time (source, created_at), INDEX idx_created (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统日志表(按月分区,30天自动清理)' PARTITION BY RANGE (TO_DAYS(created_at)) ( PARTITION p202604 VALUES LESS THAN (TO_DAYS('2026-05-01')), PARTITION p202605 VALUES LESS THAN (TO_DAYS('2026-06-01')), PARTITION p202606 VALUES LESS THAN (TO_DAYS('2026-07-01')), PARTITION p_future VALUES LESS THAN MAXVALUE ); `` --- ### 3.3 采集服务心跳表 log_collector_heartbeat ``sql CREATE TABLE log_collector_heartbeat ( id BIGINT AUTO_INCREMENT PRIMARY KEY, service_id VARCHAR(50) NOT NULL DEFAULT 'CncCollector', status VARCHAR(20) NOT NULL, collect_address_id INT NULL, last_collect_time DATETIME NULL, success_count INT NOT NULL DEFAULT 0, fail_count INT NOT NULL DEFAULT 0, uptime_seconds BIGINT NULL, detail JSON NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, INDEX idx_service_time (service_id, created_at), INDEX idx_address_time (collect_address_id, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='采集服务心跳表(7天自动清理)'; `` 心跳检测逻辑:Web API查WHERE service_id='CncCollector' AND created_at > NOW() - INTERVAL 30 SECOND,有记录=运行中,无记录=已停止。 --- ## 四、ER关系总览 ` cnc_workshop 1-----N cnc_machine cnc_brand 1-----N cnc_brand_field_mapping cnc_brand 1-----N cnc_collect_address cnc_collect_address 1--N cnc_machine cnc_machine 1-----1 cnc_worker_machine (uk_machine) cnc_worker 1-----N cnc_worker_machine cnc_machine 1-----N cnc_collect_record cnc_machine 1-----N cnc_production_segment cnc_machine 1-----N cnc_daily_production cnc_machine 1-----N cnc_machine_daily_status cnc_worker 1-----N cnc_worker_daily_summary cnc_daily_production 1--N cnc_production_adjustment cnc_worker_daily_summary 1--N cnc_production_adjustment cnc_machine 1-----N cnc_alert --- 日志库 --- cnc_collect_address 1--N log_collect_raw (弱关联,跨库) log_collector_heartbeat (独立,弱关联collect_address_id) log_system (独立) ` --- ## 五、分区维护策略 | 任务 | 频率 | 操作 | |------|------|------| | 创建新分区 | 每月1日 | 为cnc_collect_record、log_collect_raw、log_system预创建下下月分区 | | 删除过期分区 | 每月1日 | DROP超过保留期的分区 | | 清理心跳表 | 每天 | DELETE log_collector_heartbeat超过7天的记录 | | 清理告警表 | 每天 | DELETE cnc_alert已处理且超过180天的记录 | --- ## 六、索引设计总览 | 表 | 索引名 | 类型 | 覆盖场景 | |----|--------|------|---------| | cnc_brand_field_mapping | uk_brand_standard | UNIQUE | 按品牌查映射规则 | | cnc_collect_address | idx_brand | INDEX | 按品牌加载地址 | | cnc_collect_address | idx_enabled | INDEX | 查启用的地址 | | cnc_machine | uk_device_code | UNIQUE | 采集device匹配 | | cnc_machine | idx_workshop | INDEX | 按车间筛选 | | cnc_machine | idx_enabled_online | INDEX | 大屏在线机床查询 | | cnc_machine | idx_enabled_address | INDEX | 采集服务按地址查机床 | | cnc_worker_machine | uk_machine | UNIQUE | 一对一绑定+按机床查工人 | | cnc_worker_machine | idx_worker | INDEX | 按工人查机床列表 | | cnc_collect_record | idx_machine_time | INDEX | 报表/趋势图/汇总计算 | | cnc_collect_record | idx_collect_time | INDEX | 全局状态快照 | | cnc_production_segment | idx_machine_date | INDEX | 日汇总计算 | | cnc_production_segment | idx_machine_date_program | INDEX | 按程序合并计算 | | cnc_production_segment | idx_active | INDEX | 查找活跃段 | | cnc_machine_daily_status | uk_machine_date | UNIQUE | 每天一条状态 | | cnc_machine_daily_status | idx_date_status | INDEX | 按天查状态 | | cnc_daily_production | uk_machine_date_program | UNIQUE | 机床+日+程序唯一 | | cnc_daily_production | idx_date | INDEX | 按日期查汇总 | | cnc_daily_production | idx_date_program | INDEX | 按日期+程序查 | | cnc_worker_daily_summary | uk_worker_date | UNIQUE | 工人+日唯一 | | cnc_worker_daily_summary | idx_date | INDEX | 按日期查工人汇总 | | cnc_worker_daily_summary | idx_date_quantity | INDEX | 排行榜查询 | | cnc_production_adjustment | idx_target | INDEX | 修正历史查询 | | cnc_production_adjustment | idx_created | INDEX | 审计日志时间查询 | | cnc_alert | idx_type_resolved | INDEX | 按类型查未处理 | | cnc_alert | idx_machine_time | INDEX | 机床告警历史 | | cnc_alert | idx_unresolved | INDEX | 未处理告警列表 | | log_collect_raw | idx_address_time | INDEX | 按地址查原始数据 | | log_collect_raw | idx_request_time | INDEX | 时间范围清理 | | log_system | idx_level_time | INDEX | 按级别查错误日志 | | log_system | idx_source_time | INDEX | 按来源查日志 | | log_collector_heartbeat | idx_service_time | INDEX | 服务最新状态 | | log_collector_heartbeat | idx_address_time | INDEX | 地址心跳历史 | 共计:20张表,34个索引(含唯一索引)