智慧水务管理系统 - 精河县供水工程综合管理平台

init.sql 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. -- TDengine 时序数据库建表脚本
  2. -- 生成时间: 2026-06-15
  3. -- 作者: bot_dev1 (基于 Issue #18 任务)
  4. -- 创建数据库
  5. CREATE DATABASE IF NOT EXISTS water_mgt;
  6. USE water_mgt;
  7. -- ========= 设备遥测数据超级表 =========
  8. -- 水表流量数据
  9. CREATE STABLE IF NOT EXISTS iot_flow_data (
  10. ts TIMESTAMP,
  11. device_sn NCHAR(100),
  12. metric_key NCHAR(50),
  13. metric_value DOUBLE,
  14. quality TINYINT -- 0:正常 1:可疑 2:错误
  15. ) TAGS (
  16. device_type NCHAR(30),
  17. area NCHAR(50),
  18. station_id NCHAR(50),
  19. data_level NCHAR(20) -- raw/processed/aggregated
  20. );
  21. -- 压力传感器数据
  22. CREATE STABLE IF NOT EXISTS iot_pressure_data (
  23. ts TIMESTAMP,
  24. device_sn NCHAR(100),
  25. metric_key NCHAR(50),
  26. metric_value DOUBLE,
  27. quality TINYINT
  28. ) TAGS (
  29. device_type NCHAR(30),
  30. area NCHAR(50),
  31. station_id NCHAR(50),
  32. data_level NCHAR(20)
  33. );
  34. -- 水质监测数据
  35. CREATE STABLE IF NOT EXISTS iot_water_quality_data (
  36. ts TIMESTAMP,
  37. device_sn NCHAR(100),
  38. metric_key NCHAR(50),
  39. metric_value DOUBLE,
  40. quality TINYINT
  41. ) TAGS (
  42. device_type NCHAR(30),
  43. area NCHAR(50),
  44. station_id NCHAR(50),
  45. data_level NCHAR(20)
  46. );
  47. -- 液位传感器数据
  48. CREATE STABLE IF NOT EXISTS iot_level_data (
  49. ts TIMESTAMP,
  50. device_sn NCHAR(100),
  51. metric_key NCHAR(50),
  52. metric_value DOUBLE,
  53. quality TINYINT
  54. ) TAGS (
  55. device_type NCHAR(30),
  56. area NCHAR(50),
  57. station_id NCHAR(50),
  58. data_level NCHAR(20)
  59. );
  60. -- 阀门状态数据
  61. CREATE STABLE IF NOT EXISTS iot_valve_data (
  62. ts TIMESTAMP,
  63. device_sn NCHAR(100),
  64. metric_key NCHAR(50),
  65. metric_value DOUBLE,
  66. quality TINYINT
  67. ) TAGS (
  68. device_type NCHAR(30),
  69. area NCHAR(50),
  70. station_id NCHAR(50),
  71. data_level NCHAR(20)
  72. );
  73. -- 设备状态数据
  74. CREATE STABLE IF NOT EXISTS iot_status_data (
  75. ts TIMESTAMP,
  76. device_sn NCHAR(100),
  77. metric_key NCHAR(50),
  78. metric_value DOUBLE,
  79. quality TINYINT
  80. ) TAGS (
  81. device_type NCHAR(30),
  82. area NCHAR(50),
  83. station_id NCHAR(50),
  84. data_level NCHAR(20)
  85. );
  86. -- ========= 按片区和设备类型创建子表 =========
  87. -- 精芒片区 - 各类设备数据
  88. CREATE TABLE IF NOT EXISTS jingmang_flow_data USING iot_flow_data TAGS('flow_meter', '精芒片区', 'jm001', 'raw');
  89. CREATE TABLE IF NOT EXISTS jingmang_pressure_data USING iot_pressure_data TAGS('pressure_sensor', '精芒片区', 'jm001', 'raw');
  90. CREATE TABLE IF NOT EXISTS jingmang_water_quality_data USING iot_water_quality_data TAGS('water_quality', '精芒片区', 'jm001', 'raw');
  91. CREATE TABLE IF NOT EXISTS jingmang_level_data USING iot_level_data TAGS('level_sensor', '精芒片区', 'jm001', 'raw');
  92. -- 托里片区 - 各类设备数据
  93. CREATE TABLE IF NOT EXISTS tuoli_flow_data USING iot_flow_data TAGS('flow_meter', '托里片区', 'tl001', 'raw');
  94. CREATE TABLE IF NOT EXISTS tuoli_pressure_data USING iot_pressure_data TAGS('pressure_sensor', '托里片区', 'tl001', 'raw');
  95. CREATE TABLE IF NOT EXISTS tuoli_water_quality_data USING iot_water_quality_data TAGS('water_quality', '托里片区', 'tl001', 'raw');
  96. CREATE TABLE IF NOT EXISTS tuoli_level_data USING iot_level_data TAGS('level_sensor', '托里片区', 'tl001', 'raw');
  97. -- 一体化水厂 - 各类设备数据
  98. CREATE TABLE IF NOT EXISTS yiti_water_plant_flow_data USING iot_flow_data TAGS('flow_meter', '一体化水厂', 'yt001', 'raw');
  99. CREATE TABLE IF NOT EXISTS yiti_water_plant_pressure_data USING iot_pressure_data TAGS('pressure_sensor', '一体化水厂', 'yt001', 'raw');
  100. CREATE TABLE IF NOT EXISTS yiti_water_plant_water_quality_data USING iot_water_quality_data TAGS('water_quality', '一体化水厂', 'yt001', 'raw');
  101. CREATE TABLE IF NOT EXISTS yiti_water_plant_level_data USING iot_level_data TAGS('level_sensor', '一体化水厂', 'yt001', 'raw');
  102. -- 压力站点数据
  103. CREATE TABLE IF NOT EXISTS pressure_station1_data USING iot_pressure_data TAGS('pressure_sensor', '精芒片区', 'ps001', 'raw');
  104. CREATE TABLE IF NOT EXISTS pressure_station2_data USING iot_pressure_data TAGS('压力传感器', '托里片区', 'ps002', 'raw');
  105. -- 管网监测点数据
  106. CREATE TABLE IF NOT EXISTS pipe_network1_data USING iot_pressure_data TAGS('管网监测', '精芒片区', 'pn001', 'raw');
  107. CREATE TABLE IF NOT EXISTS pipe_network2_data USING iot_level_data TAGS('管网监测', '托里片区', 'pn002', 'raw');
  108. -- 村庄供水点数据
  109. CREATE TABLE IF NOT EXISTS village1_data USING iot_flow_data TAGS('村口水表', '精芒片区', 'v001', 'raw');
  110. CREATE TABLE IF NOT EXISTS village2_data USING iot_level_data TAGS('水池监测', '托里片区', 'v002', 'raw');
  111. -- ========= 按处理级别创建聚合数据表 =========
  112. -- 分钟级聚合数据
  113. CREATE TABLE IF NOT EXISTS jingmang_flow_min_data USING iot_flow_data TAGS('flow_meter', '精芒片区', 'jm001', 'minute');
  114. CREATE TABLE IF NOT EXISTS tuoli_flow_min_data USING iot_flow_data TAGS('flow_meter', '托里片区', 'tl001', 'minute');
  115. CREATE TABLE IF NOT EXISTS yiti_flow_min_data USING iot_flow_data TAGS('flow_meter', '一体化水厂', 'yt001', 'minute');
  116. -- 小时级聚合数据
  117. CREATE TABLE IF NOT EXISTS jingmang_flow_hour_data USING iot_flow_data TAGS('flow_meter', '精芒片区', 'jm001', 'hour');
  118. CREATE TABLE IF NOT EXISTS tuoli_flow_hour_data USING iot_flow_data TAGS('flow_meter', '托里片区', 'tl001', 'hour');
  119. CREATE TABLE IF NOT EXISTS yiti_flow_hour_data USING iot_flow_data TAGS('flow_meter', '一体化水厂', 'yt001', 'hour');
  120. -- 日级聚合数据
  121. CREATE TABLE IF NOT EXISTS jingmang_flow_day_data USING iot_flow_data TAGS('flow_meter', '精芒片区', 'jm001', 'day');
  122. CREATE TABLE IF NOT EXISTS tuoli_flow_day_data USING iot_flow_data TAGS('flow_meter', '托里片区', 'tl001', 'day');
  123. CREATE TABLE IF NOT EXISTS yiti_flow_day_data USING iot_flow_data TAGS('flow_meter', '一体化水厂', 'yt001', 'day');
  124. -- ========= 报警阈值数据表 =========
  125. CREATE STABLE IF NOT EXISTS iot_alert_threshold (
  126. ts TIMESTAMP,
  127. device_type NCHAR(30),
  128. metric_key NCHAR(50),
  129. min_value DOUBLE,
  130. max_value DOUBLE,
  131. alert_level NCHAR(10), -- info/warning/critical/emergency
  132. rule_name NCHAR(100)
  133. ) TAGS (
  134. area NCHAR(50),
  135. station_id NCHAR(50)
  136. );
  137. -- 报警阈值数据表实例
  138. CREATE TABLE IF NOT EXISTS jingmang_alert_threshold USING iot_alert_threshold TAGS('精芒片区', 'jm001');
  139. CREATE TABLE IF NOT EXISTS tuoli_alert_threshold USING iot_alert_threshold TAGS('托里片区', 'tl001');
  140. CREATE TABLE IF NOT EXISTS yiti_alert_threshold USING iot_alert_threshold TAGS('一体化水厂', 'yt001');
  141. -- ========= 设备运行统计表 =========
  142. CREATE STABLE IF NOT EXISTS iot_device_stats (
  143. ts TIMESTAMP,
  144. device_sn NCHAR(100),
  145. metric_key NCHAR(50),
  146. avg_value DOUBLE,
  147. max_value DOUBLE,
  148. min_value DOUBLE,
  149. count BIGINT,
  150. uptime_rate DOUBLE -- 运行率 0-100%
  151. ) TAGS (
  152. device_type NCHAR(30),
  153. area NCHAR(50),
  154. station_id NCHAR(50)
  155. );
  156. -- 设备运行统计表实例
  157. CREATE TABLE IF NOT EXISTS jingmang_device_stats USING iot_device_stats TAGS('flow_meter', '精芒片区', 'jm001');
  158. CREATE TABLE IF NOT EXISTS tuoli_device_stats USING iot_device_stats TAGS('pressure_sensor', '托里片区', 'tl001');
  159. CREATE TABLE IF NOT EXISTS yiti_device_stats USING iot_device_stats TAGS('water_quality', '一体化水厂', 'yt001');
  160. -- ========= 数据质量统计表 =========
  161. CREATE STABLE IF NOT EXISTS iot_data_quality_stats (
  162. ts TIMESTAMP,
  163. area NCHAR(50),
  164. station_id NCHAR(50),
  165. device_count BIGINT,
  166. total_records BIGINT,
  167. normal_records BIGINT,
  168. suspicious_records BIGINT,
  169. error_records BIGINT,
  170. data_quality_score DOUBLE -- 数据质量评分 0-100
  171. ) TAGS (
  172. data_type NCHAR(20) -- telemetry/alert/stats
  173. );
  174. -- 数据质量统计表实例
  175. CREATE TABLE IF NOT EXISTS telemetry_quality_stats USING iot_data_quality_stats TAGS('telemetry');
  176. CREATE TABLE IF NOT EXISTS alert_quality_stats USING iot_data_quality_stats TAGS('alert');
  177. CREATE TABLE IF NOT EXISTS stats_quality_stats USING iot_data_quality_stats TAGS('stats');
  178. -- ========= 水务业务数据表 =========
  179. -- 供水运行数据
  180. CREATE STABLE IF NOT EXISTS water_supply_stats (
  181. ts TIMESTAMP,
  182. area NCHAR(50),
  183. total_flow DOUBLE, -- 总供水流量
  184. supply_pressure DOUBLE, -- 供水压力
  185. water_quality_index DOUBLE, -- 水质指数
  186. energy_consumption DOUBLE, -- 能耗
  187. cost_efficiency DOUBLE, -- 成本效率
  188. anomaly_count INT -- 异常数量
  189. ) TAGS (
  190. station_id NCHAR(50),
  191. data_level NCHAR(20) -- daily/hourly/realtime
  192. );
  193. -- 供水运行数据表实例
  194. CREATE TABLE IF NOT EXISTS daily_water_supply_stats USING water_supply_stats TAGS('system', 'daily');
  195. CREATE TABLE IF NOT EXISTS hourly_water_supply_stats USING water_supply_stats TAGS('system', 'hourly');
  196. -- ========= 索引创建 =========
  197. -- 为超级表创建标签索引
  198. CREATE INDEX IF NOT EXISTS idx_iot_flow_device_type ON iot_flow_data(device_type);
  199. CREATE INDEX IF NOT EXISTS idx_iot_flow_area ON iot_flow_data(area);
  200. CREATE INDEX IF NOT EXISTS idx_iot_flow_ts ON iot_flow_data(ts);
  201. CREATE INDEX IF NOT EXISTS idx_iot_pressure_device_type ON iot_pressure_data(device_type);
  202. CREATE INDEX IF NOT EXISTS idx_iot_pressure_area ON iot_pressure_data(area);
  203. CREATE INDEX IF NOT EXISTS idx_iot_pressure_ts ON iot_pressure_data(ts);
  204. CREATE INDEX IF NOT EXISTS idx_iot_water_quality_device_type ON iot_water_quality_data(device_type);
  205. CREATE INDEX IF NOT EXISTS idx_iot_water_quality_area ON iot_water_quality_data(area);
  206. CREATE INDEX IF NOT EXISTS idx_iot_water_quality_ts ON iot_water_quality_data(ts);
  207. -- 为子表创建时间索引
  208. CREATE INDEX IF NOT EXISTS idx_jingmang_flow_ts ON jingmang_flow_data(ts);
  209. CREATE INDEX IF NOT EXISTS idx_tuoli_flow_ts ON tuoli_flow_data(ts);
  210. CREATE INDEX IF NOT EXISTS idx_yiti_flow_ts ON yitih_water_plant_flow_data(ts);
  211. -- 为报警阈值表创建索引
  212. CREATE INDEX IF NOT EXISTS idx_alert_threshold_device ON iot_alert_threshold(device_type);
  213. CREATE INDEX IF NOT EXISTS idx_alert_threshold_metric ON iot_alert_threshold(metric_key);
  214. CREATE INDEX IF NOT EXISTS idx_alert_threshold_ts ON iot_alert_threshold(ts);
  215. -- 为设备统计表创建索引
  216. CREATE INDEX IF NOT EXISTS idx_device_stats_device ON iot_device_stats(device_sn);
  217. CREATE INDEX IF NOT EXISTS idx_device_stats_ts ON iot_device_stats(ts);
  218. -- 为数据质量表创建索引
  219. CREATE INDEX IF NOT EXISTS idx_data_quality_ts ON iot_data_quality_stats(ts);
  220. CREATE INDEX IF NOT EXISTS idx_data_quality_area ON iot_data_quality_stats(area);
  221. -- 为供水运行数据创建索引
  222. CREATE INDEX IF NOT EXISTS idx_water_supply_ts ON water_supply_stats(ts);
  223. CREATE INDEX IF NOT EXISTS idx_water_supply_area ON water_supply_stats(area);
  224. -- ========= 表分区策略 =========
  225. -- 为主要数据表设置分区(按月)
  226. -- 语法:ALTER TABLE TABLE_NAME PARTITION BY RANGE (ts);
  227. -- ========= 用户权限设置 =========
  228. -- 设置超级用户
  229. ALTER USER root WITH SUPERUSER;
  230. -- 创建应用用户
  231. CREATE USER IF NOT EXISTS 'water_mgt_user' IDENTIFIED BY 'water_mgt_2026';
  232. GRANT READ, WRITE ON water_mgt.* TO 'water_mgt_user';
  233. GRANT CREATE TABLE ON water_mgt.* TO 'water_mgt_user';
  234. -- ========= 插入示例数据 =========
  235. -- 插入一些示例报警阈值
  236. INSERT INTO jingmang_alert_threshold (ts, device_type, metric_key, min_value, max_value, alert_level, rule_name)
  237. VALUES (NOW(), 'flow_meter', 'flow_rate', 0, 5, 'warning', '流量过高报警');
  238. INSERT INTO tuoli_alert_threshold (ts, device_type, metric_key, min_value, max_value, alert_level, rule_name)
  239. VALUES (NOW(), 'pressure_sensor', 'pressure', 0.2, 0.6, 'critical', '压力异常报警');
  240. INSERT INTO yiti_alert_threshold (ts, device_type, metric_key, min_value, max_value, alert_level, rule_name)
  241. VALUES (NOW(), 'water_quality', 'turbidity', 0, 5, 'emergency', '浊度严重报警');
  242. -- ========= 数据库配置说明 =========
  243. -- 1.超级表(Stable):定义数据结构模板
  244. -- 2.子表(Table):基于超级表创建具体的数据表
  245. -- 3.TAGS:标签信息,用于数据查询和筛选
  246. -- 4.数据质量字段:用于数据质量监控
  247. -- 5.分区策略:按月分区,便于历史数据管理
  248. -- 6.用户权限:最小权限原则,只给应用必要的权限
  249. -- ========= 使用说明 =========
  250. -- 1. 写入数据时使用对应的子表名称
  251. -- 2. 查询数据时可以按标签进行筛选
  252. -- 3. 聚合数据按处理级别分开存储
  253. -- 4. 定期维护分区策略