| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- -- TDengine 时序数据库建表脚本
- -- 生成时间: 2026-06-15
- -- 作者: bot_dev1 (基于 Issue #18 任务)
-
- -- 创建数据库
- CREATE DATABASE IF NOT EXISTS water_mgt;
- USE water_mgt;
-
- -- ========= 设备遥测数据超级表 =========
- -- 水表流量数据
- CREATE STABLE IF NOT EXISTS iot_flow_data (
- ts TIMESTAMP,
- device_sn NCHAR(100),
- metric_key NCHAR(50),
- metric_value DOUBLE,
- quality TINYINT -- 0:正常 1:可疑 2:错误
- ) TAGS (
- device_type NCHAR(30),
- area NCHAR(50),
- station_id NCHAR(50),
- data_level NCHAR(20) -- raw/processed/aggregated
- );
-
- -- 压力传感器数据
- CREATE STABLE IF NOT EXISTS iot_pressure_data (
- ts TIMESTAMP,
- device_sn NCHAR(100),
- metric_key NCHAR(50),
- metric_value DOUBLE,
- quality TINYINT
- ) TAGS (
- device_type NCHAR(30),
- area NCHAR(50),
- station_id NCHAR(50),
- data_level NCHAR(20)
- );
-
- -- 水质监测数据
- CREATE STABLE IF NOT EXISTS iot_water_quality_data (
- ts TIMESTAMP,
- device_sn NCHAR(100),
- metric_key NCHAR(50),
- metric_value DOUBLE,
- quality TINYINT
- ) TAGS (
- device_type NCHAR(30),
- area NCHAR(50),
- station_id NCHAR(50),
- data_level NCHAR(20)
- );
-
- -- 液位传感器数据
- CREATE STABLE IF NOT EXISTS iot_level_data (
- ts TIMESTAMP,
- device_sn NCHAR(100),
- metric_key NCHAR(50),
- metric_value DOUBLE,
- quality TINYINT
- ) TAGS (
- device_type NCHAR(30),
- area NCHAR(50),
- station_id NCHAR(50),
- data_level NCHAR(20)
- );
-
- -- 阀门状态数据
- CREATE STABLE IF NOT EXISTS iot_valve_data (
- ts TIMESTAMP,
- device_sn NCHAR(100),
- metric_key NCHAR(50),
- metric_value DOUBLE,
- quality TINYINT
- ) TAGS (
- device_type NCHAR(30),
- area NCHAR(50),
- station_id NCHAR(50),
- data_level NCHAR(20)
- );
-
- -- 设备状态数据
- CREATE STABLE IF NOT EXISTS iot_status_data (
- ts TIMESTAMP,
- device_sn NCHAR(100),
- metric_key NCHAR(50),
- metric_value DOUBLE,
- quality TINYINT
- ) TAGS (
- device_type NCHAR(30),
- area NCHAR(50),
- station_id NCHAR(50),
- data_level NCHAR(20)
- );
-
- -- ========= 按片区和设备类型创建子表 =========
- -- 精芒片区 - 各类设备数据
- CREATE TABLE IF NOT EXISTS jingmang_flow_data USING iot_flow_data TAGS('flow_meter', '精芒片区', 'jm001', 'raw');
- CREATE TABLE IF NOT EXISTS jingmang_pressure_data USING iot_pressure_data TAGS('pressure_sensor', '精芒片区', 'jm001', 'raw');
- CREATE TABLE IF NOT EXISTS jingmang_water_quality_data USING iot_water_quality_data TAGS('water_quality', '精芒片区', 'jm001', 'raw');
- CREATE TABLE IF NOT EXISTS jingmang_level_data USING iot_level_data TAGS('level_sensor', '精芒片区', 'jm001', 'raw');
-
- -- 托里片区 - 各类设备数据
- CREATE TABLE IF NOT EXISTS tuoli_flow_data USING iot_flow_data TAGS('flow_meter', '托里片区', 'tl001', 'raw');
- CREATE TABLE IF NOT EXISTS tuoli_pressure_data USING iot_pressure_data TAGS('pressure_sensor', '托里片区', 'tl001', 'raw');
- CREATE TABLE IF NOT EXISTS tuoli_water_quality_data USING iot_water_quality_data TAGS('water_quality', '托里片区', 'tl001', 'raw');
- CREATE TABLE IF NOT EXISTS tuoli_level_data USING iot_level_data TAGS('level_sensor', '托里片区', 'tl001', 'raw');
-
- -- 一体化水厂 - 各类设备数据
- CREATE TABLE IF NOT EXISTS yiti_water_plant_flow_data USING iot_flow_data TAGS('flow_meter', '一体化水厂', 'yt001', 'raw');
- CREATE TABLE IF NOT EXISTS yiti_water_plant_pressure_data USING iot_pressure_data TAGS('pressure_sensor', '一体化水厂', 'yt001', 'raw');
- CREATE TABLE IF NOT EXISTS yiti_water_plant_water_quality_data USING iot_water_quality_data TAGS('water_quality', '一体化水厂', 'yt001', 'raw');
- CREATE TABLE IF NOT EXISTS yiti_water_plant_level_data USING iot_level_data TAGS('level_sensor', '一体化水厂', 'yt001', 'raw');
-
- -- 压力站点数据
- CREATE TABLE IF NOT EXISTS pressure_station1_data USING iot_pressure_data TAGS('pressure_sensor', '精芒片区', 'ps001', 'raw');
- CREATE TABLE IF NOT EXISTS pressure_station2_data USING iot_pressure_data TAGS('压力传感器', '托里片区', 'ps002', 'raw');
-
- -- 管网监测点数据
- CREATE TABLE IF NOT EXISTS pipe_network1_data USING iot_pressure_data TAGS('管网监测', '精芒片区', 'pn001', 'raw');
- CREATE TABLE IF NOT EXISTS pipe_network2_data USING iot_level_data TAGS('管网监测', '托里片区', 'pn002', 'raw');
-
- -- 村庄供水点数据
- CREATE TABLE IF NOT EXISTS village1_data USING iot_flow_data TAGS('村口水表', '精芒片区', 'v001', 'raw');
- CREATE TABLE IF NOT EXISTS village2_data USING iot_level_data TAGS('水池监测', '托里片区', 'v002', 'raw');
-
- -- ========= 按处理级别创建聚合数据表 =========
- -- 分钟级聚合数据
- CREATE TABLE IF NOT EXISTS jingmang_flow_min_data USING iot_flow_data TAGS('flow_meter', '精芒片区', 'jm001', 'minute');
- CREATE TABLE IF NOT EXISTS tuoli_flow_min_data USING iot_flow_data TAGS('flow_meter', '托里片区', 'tl001', 'minute');
- CREATE TABLE IF NOT EXISTS yiti_flow_min_data USING iot_flow_data TAGS('flow_meter', '一体化水厂', 'yt001', 'minute');
-
- -- 小时级聚合数据
- CREATE TABLE IF NOT EXISTS jingmang_flow_hour_data USING iot_flow_data TAGS('flow_meter', '精芒片区', 'jm001', 'hour');
- CREATE TABLE IF NOT EXISTS tuoli_flow_hour_data USING iot_flow_data TAGS('flow_meter', '托里片区', 'tl001', 'hour');
- CREATE TABLE IF NOT EXISTS yiti_flow_hour_data USING iot_flow_data TAGS('flow_meter', '一体化水厂', 'yt001', 'hour');
-
- -- 日级聚合数据
- CREATE TABLE IF NOT EXISTS jingmang_flow_day_data USING iot_flow_data TAGS('flow_meter', '精芒片区', 'jm001', 'day');
- CREATE TABLE IF NOT EXISTS tuoli_flow_day_data USING iot_flow_data TAGS('flow_meter', '托里片区', 'tl001', 'day');
- CREATE TABLE IF NOT EXISTS yiti_flow_day_data USING iot_flow_data TAGS('flow_meter', '一体化水厂', 'yt001', 'day');
-
- -- ========= 报警阈值数据表 =========
- CREATE STABLE IF NOT EXISTS iot_alert_threshold (
- ts TIMESTAMP,
- device_type NCHAR(30),
- metric_key NCHAR(50),
- min_value DOUBLE,
- max_value DOUBLE,
- alert_level NCHAR(10), -- info/warning/critical/emergency
- rule_name NCHAR(100)
- ) TAGS (
- area NCHAR(50),
- station_id NCHAR(50)
- );
-
- -- 报警阈值数据表实例
- CREATE TABLE IF NOT EXISTS jingmang_alert_threshold USING iot_alert_threshold TAGS('精芒片区', 'jm001');
- CREATE TABLE IF NOT EXISTS tuoli_alert_threshold USING iot_alert_threshold TAGS('托里片区', 'tl001');
- CREATE TABLE IF NOT EXISTS yiti_alert_threshold USING iot_alert_threshold TAGS('一体化水厂', 'yt001');
-
- -- ========= 设备运行统计表 =========
- CREATE STABLE IF NOT EXISTS iot_device_stats (
- ts TIMESTAMP,
- device_sn NCHAR(100),
- metric_key NCHAR(50),
- avg_value DOUBLE,
- max_value DOUBLE,
- min_value DOUBLE,
- count BIGINT,
- uptime_rate DOUBLE -- 运行率 0-100%
- ) TAGS (
- device_type NCHAR(30),
- area NCHAR(50),
- station_id NCHAR(50)
- );
-
- -- 设备运行统计表实例
- CREATE TABLE IF NOT EXISTS jingmang_device_stats USING iot_device_stats TAGS('flow_meter', '精芒片区', 'jm001');
- CREATE TABLE IF NOT EXISTS tuoli_device_stats USING iot_device_stats TAGS('pressure_sensor', '托里片区', 'tl001');
- CREATE TABLE IF NOT EXISTS yiti_device_stats USING iot_device_stats TAGS('water_quality', '一体化水厂', 'yt001');
-
- -- ========= 数据质量统计表 =========
- CREATE STABLE IF NOT EXISTS iot_data_quality_stats (
- ts TIMESTAMP,
- area NCHAR(50),
- station_id NCHAR(50),
- device_count BIGINT,
- total_records BIGINT,
- normal_records BIGINT,
- suspicious_records BIGINT,
- error_records BIGINT,
- data_quality_score DOUBLE -- 数据质量评分 0-100
- ) TAGS (
- data_type NCHAR(20) -- telemetry/alert/stats
- );
-
- -- 数据质量统计表实例
- CREATE TABLE IF NOT EXISTS telemetry_quality_stats USING iot_data_quality_stats TAGS('telemetry');
- CREATE TABLE IF NOT EXISTS alert_quality_stats USING iot_data_quality_stats TAGS('alert');
- CREATE TABLE IF NOT EXISTS stats_quality_stats USING iot_data_quality_stats TAGS('stats');
-
- -- ========= 水务业务数据表 =========
- -- 供水运行数据
- CREATE STABLE IF NOT EXISTS water_supply_stats (
- ts TIMESTAMP,
- area NCHAR(50),
- total_flow DOUBLE, -- 总供水流量
- supply_pressure DOUBLE, -- 供水压力
- water_quality_index DOUBLE, -- 水质指数
- energy_consumption DOUBLE, -- 能耗
- cost_efficiency DOUBLE, -- 成本效率
- anomaly_count INT -- 异常数量
- ) TAGS (
- station_id NCHAR(50),
- data_level NCHAR(20) -- daily/hourly/realtime
- );
-
- -- 供水运行数据表实例
- CREATE TABLE IF NOT EXISTS daily_water_supply_stats USING water_supply_stats TAGS('system', 'daily');
- CREATE TABLE IF NOT EXISTS hourly_water_supply_stats USING water_supply_stats TAGS('system', 'hourly');
-
- -- ========= 索引创建 =========
- -- 为超级表创建标签索引
- CREATE INDEX IF NOT EXISTS idx_iot_flow_device_type ON iot_flow_data(device_type);
- CREATE INDEX IF NOT EXISTS idx_iot_flow_area ON iot_flow_data(area);
- CREATE INDEX IF NOT EXISTS idx_iot_flow_ts ON iot_flow_data(ts);
-
- CREATE INDEX IF NOT EXISTS idx_iot_pressure_device_type ON iot_pressure_data(device_type);
- CREATE INDEX IF NOT EXISTS idx_iot_pressure_area ON iot_pressure_data(area);
- CREATE INDEX IF NOT EXISTS idx_iot_pressure_ts ON iot_pressure_data(ts);
-
- CREATE INDEX IF NOT EXISTS idx_iot_water_quality_device_type ON iot_water_quality_data(device_type);
- CREATE INDEX IF NOT EXISTS idx_iot_water_quality_area ON iot_water_quality_data(area);
- CREATE INDEX IF NOT EXISTS idx_iot_water_quality_ts ON iot_water_quality_data(ts);
-
- -- 为子表创建时间索引
- CREATE INDEX IF NOT EXISTS idx_jingmang_flow_ts ON jingmang_flow_data(ts);
- CREATE INDEX IF NOT EXISTS idx_tuoli_flow_ts ON tuoli_flow_data(ts);
- CREATE INDEX IF NOT EXISTS idx_yiti_flow_ts ON yitih_water_plant_flow_data(ts);
-
- -- 为报警阈值表创建索引
- CREATE INDEX IF NOT EXISTS idx_alert_threshold_device ON iot_alert_threshold(device_type);
- CREATE INDEX IF NOT EXISTS idx_alert_threshold_metric ON iot_alert_threshold(metric_key);
- CREATE INDEX IF NOT EXISTS idx_alert_threshold_ts ON iot_alert_threshold(ts);
-
- -- 为设备统计表创建索引
- CREATE INDEX IF NOT EXISTS idx_device_stats_device ON iot_device_stats(device_sn);
- CREATE INDEX IF NOT EXISTS idx_device_stats_ts ON iot_device_stats(ts);
-
- -- 为数据质量表创建索引
- CREATE INDEX IF NOT EXISTS idx_data_quality_ts ON iot_data_quality_stats(ts);
- CREATE INDEX IF NOT EXISTS idx_data_quality_area ON iot_data_quality_stats(area);
-
- -- 为供水运行数据创建索引
- CREATE INDEX IF NOT EXISTS idx_water_supply_ts ON water_supply_stats(ts);
- CREATE INDEX IF NOT EXISTS idx_water_supply_area ON water_supply_stats(area);
-
- -- ========= 表分区策略 =========
- -- 为主要数据表设置分区(按月)
- -- 语法:ALTER TABLE TABLE_NAME PARTITION BY RANGE (ts);
-
- -- ========= 用户权限设置 =========
- -- 设置超级用户
- ALTER USER root WITH SUPERUSER;
-
- -- 创建应用用户
- CREATE USER IF NOT EXISTS 'water_mgt_user' IDENTIFIED BY 'water_mgt_2026';
- GRANT READ, WRITE ON water_mgt.* TO 'water_mgt_user';
- GRANT CREATE TABLE ON water_mgt.* TO 'water_mgt_user';
-
- -- ========= 插入示例数据 =========
- -- 插入一些示例报警阈值
- INSERT INTO jingmang_alert_threshold (ts, device_type, metric_key, min_value, max_value, alert_level, rule_name)
- VALUES (NOW(), 'flow_meter', 'flow_rate', 0, 5, 'warning', '流量过高报警');
-
- INSERT INTO tuoli_alert_threshold (ts, device_type, metric_key, min_value, max_value, alert_level, rule_name)
- VALUES (NOW(), 'pressure_sensor', 'pressure', 0.2, 0.6, 'critical', '压力异常报警');
-
- INSERT INTO yiti_alert_threshold (ts, device_type, metric_key, min_value, max_value, alert_level, rule_name)
- VALUES (NOW(), 'water_quality', 'turbidity', 0, 5, 'emergency', '浊度严重报警');
-
- -- ========= 数据库配置说明 =========
- -- 1.超级表(Stable):定义数据结构模板
- -- 2.子表(Table):基于超级表创建具体的数据表
- -- 3.TAGS:标签信息,用于数据查询和筛选
- -- 4.数据质量字段:用于数据质量监控
- -- 5.分区策略:按月分区,便于历史数据管理
- -- 6.用户权限:最小权限原则,只给应用必要的权限
-
- -- ========= 使用说明 =========
- -- 1. 写入数据时使用对应的子表名称
- -- 2. 查询数据时可以按标签进行筛选
- -- 3. 聚合数据按处理级别分开存储
- -- 4. 定期维护分区策略
|