| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- -- =============================================
- -- 智慧水务管理系统 - 物联网设备相关 DDL
- -- 版本: V1
- -- =============================================
-
- -- 扩展
- CREATE EXTENSION IF NOT EXISTS postgis;
-
- -- 设备模型定义
- CREATE TABLE IF NOT EXISTS iot_device_model (
- id BIGSERIAL PRIMARY KEY,
- model_key VARCHAR(50) UNIQUE NOT NULL,
- model_name VARCHAR(100) NOT NULL,
- vendor VARCHAR(100),
- protocol VARCHAR(20) NOT NULL, -- MQTT/Modbus/CoAP/HTTP
- properties JSONB, -- [{key, name, unit, data_type, range_min, range_max}]
- commands JSONB, -- [{key, name, params: [{key, name, type}]}]
- status SMALLINT DEFAULT 1,
- created_at TIMESTAMP DEFAULT NOW(),
- updated_at TIMESTAMP DEFAULT NOW()
- );
- COMMENT ON TABLE iot_device_model IS '设备模型定义表';
- COMMENT ON COLUMN iot_device_model.properties IS '属性定义JSON数组';
- COMMENT ON COLUMN iot_device_model.commands IS '支持指令JSON数组';
-
- -- 设备实例
- CREATE TABLE IF NOT EXISTS iot_device (
- id BIGSERIAL PRIMARY KEY,
- device_sn VARCHAR(100) UNIQUE NOT NULL,
- device_name VARCHAR(200) NOT NULL,
- model_id BIGINT REFERENCES iot_device_model(id),
- device_type VARCHAR(30) NOT NULL, -- flow_meter/pressure_sensor/valve/water_quality/level_sensor/pump
- position_type VARCHAR(20), -- water_plant/pressure_station/pipe_network/village
- label VARCHAR(50), -- 设备标签(便于搜索)
- loc_lng DOUBLE PRECISION,
- loc_lat DOUBLE PRECISION,
- geom GEOMETRY(Point, 4326),
- area VARCHAR(50) NOT NULL, -- 所属片区
- station_id BIGINT, -- 所属站点
- address VARCHAR(300),
- install_date DATE,
- warranty_until DATE,
- status VARCHAR(20) DEFAULT 'offline', -- online/offline/maintenance/fault
- firmware_version VARCHAR(20),
- last_report_time TIMESTAMP,
- metadata JSONB,
- created_at TIMESTAMP DEFAULT NOW(),
- updated_at TIMESTAMP DEFAULT NOW()
- );
- COMMENT ON TABLE iot_device IS '设备实例表';
- COMMENT ON COLUMN iot_device.geom IS 'PostGIS空间坐标点';
- COMMENT ON COLUMN iot_device.metadata IS '扩展元数据';
-
- -- 空间索引
- CREATE INDEX IF NOT EXISTS idx_iot_device_geom ON iot_device USING GIST(geom);
- CREATE INDEX IF NOT EXISTS idx_iot_device_area ON iot_device(area);
- CREATE INDEX IF NOT EXISTS idx_iot_device_type ON iot_device(device_type);
- CREATE INDEX IF NOT EXISTS idx_iot_device_status ON iot_device(status);
-
- -- 设备影子
- CREATE TABLE IF NOT EXISTS iot_device_shadow (
- id BIGSERIAL PRIMARY KEY,
- device_id BIGINT UNIQUE REFERENCES iot_device(id),
- reported_state JSONB, -- 设备上报的最新状态
- desired_state JSONB, -- 期望状态(云端下发)
- delta_state JSONB, -- 差异状态
- version BIGINT DEFAULT 1,
- updated_at TIMESTAMP DEFAULT NOW()
- );
- COMMENT ON TABLE iot_device_shadow IS '设备影子表';
-
- -- 设备事件
- CREATE TABLE IF NOT EXISTS iot_device_event (
- id BIGSERIAL PRIMARY KEY,
- device_id BIGINT REFERENCES iot_device(id),
- device_sn VARCHAR(100) NOT NULL,
- event_type VARCHAR(30) NOT NULL, -- online/offline/fault/recovery/ota
- event_data JSONB,
- created_at TIMESTAMP DEFAULT NOW()
- );
- COMMENT ON TABLE iot_device_event IS '设备事件表';
- CREATE INDEX IF NOT EXISTS idx_iot_device_event_sn ON iot_device_event(device_sn, created_at DESC);
-
- -- 站点管理(水厂/调压站等)
- CREATE TABLE IF NOT EXISTS iot_station (
- id BIGSERIAL PRIMARY KEY,
- station_name VARCHAR(100) NOT NULL,
- station_type VARCHAR(30) NOT NULL, -- water_plant/pressure_station/pump_station
- area VARCHAR(50) NOT NULL,
- loc_lng DOUBLE PRECISION,
- loc_lat DOUBLE PRECISION,
- geom GEOMETRY(Point, 4326),
- address VARCHAR(300),
- manager VARCHAR(50),
- manager_phone VARCHAR(20),
- status SMALLINT DEFAULT 1,
- created_at TIMESTAMP DEFAULT NOW(),
- updated_at TIMESTAMP DEFAULT NOW()
- );
- COMMENT ON TABLE iot_station IS '站点管理表';
- CREATE INDEX IF NOT EXISTS idx_iot_station_geom ON iot_station USING GIST(geom);
|