| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- -- =====================================================
- -- DMA分区计量与漏损分析 DDL
- -- 数据库: PostgreSQL
- -- =====================================================
-
- -- DMA分区表
- CREATE TABLE IF NOT EXISTS dma_zone (
- id BIGSERIAL PRIMARY KEY,
- zone_name VARCHAR(100) NOT NULL,
- zone_code VARCHAR(50) NOT NULL UNIQUE,
- parent_id BIGINT REFERENCES dma_zone(id),
- zone_level INTEGER NOT NULL DEFAULT 1,
- area VARCHAR(100),
- area_size NUMERIC(10, 2),
- population INTEGER,
- pipe_length NUMERIC(10, 2),
- status VARCHAR(20) DEFAULT 'active',
- remark VARCHAR(500),
- deleted INTEGER DEFAULT 0,
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
-
- COMMENT ON TABLE dma_zone IS 'DMA分区表';
- COMMENT ON COLUMN dma_zone.zone_level IS '分区层级: 1=一级/2=二级/3=三级';
- COMMENT ON COLUMN dma_zone.status IS '状态: active/inactive';
-
- -- DMA计量表
- CREATE TABLE IF NOT EXISTS dma_meter (
- id BIGSERIAL PRIMARY KEY,
- zone_id BIGINT REFERENCES dma_zone(id),
- meter_code VARCHAR(50) NOT NULL UNIQUE,
- meter_name VARCHAR(100),
- meter_type VARCHAR(20) NOT NULL,
- location VARCHAR(200),
- longitude NUMERIC(12, 8),
- latitude NUMERIC(12, 8),
- caliber INTEGER,
- brand VARCHAR(100),
- status VARCHAR(20) DEFAULT 'online',
- remark VARCHAR(500),
- deleted INTEGER DEFAULT 0,
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
-
- COMMENT ON TABLE dma_meter IS 'DMA计量表';
- COMMENT ON COLUMN dma_meter.meter_type IS '表计类型: inlet=进水表/outlet=出水表/boundary=边界表';
- COMMENT ON COLUMN dma_meter.status IS '状态: online/offline/fault';
-
- CREATE INDEX IF NOT EXISTS idx_meter_zone ON dma_meter(zone_id);
-
- -- DMA流量记录表
- CREATE TABLE IF NOT EXISTS dma_flow_record (
- id BIGSERIAL PRIMARY KEY,
- zone_id BIGINT NOT NULL REFERENCES dma_zone(id),
- meter_id BIGINT NOT NULL REFERENCES dma_meter(id),
- instant_flow NUMERIC(12, 4),
- total_flow NUMERIC(14, 4),
- pressure NUMERIC(8, 4),
- collect_time TIMESTAMP NOT NULL,
- data_quality VARCHAR(20) DEFAULT 'good',
- deleted INTEGER DEFAULT 0,
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
-
- COMMENT ON TABLE dma_flow_record IS 'DMA流量记录表';
- COMMENT ON COLUMN dma_flow_record.instant_flow IS '瞬时流量(m³/h)';
- COMMENT ON COLUMN dma_flow_record.total_flow IS '累计流量(m³)';
- COMMENT ON COLUMN dma_flow_record.pressure IS '压力(MPa)';
- COMMENT ON COLUMN dma_flow_record.data_quality IS '数据质量: good/bad/missing';
-
- CREATE INDEX IF NOT EXISTS idx_flow_zone_time ON dma_flow_record(zone_id, collect_time);
- CREATE INDEX IF NOT EXISTS idx_flow_meter_time ON dma_flow_record(meter_id, collect_time);
-
- -- DMA漏损分析表
- CREATE TABLE IF NOT EXISTS dma_leakage_analysis (
- id BIGSERIAL PRIMARY KEY,
- zone_id BIGINT NOT NULL REFERENCES dma_zone(id),
- analysis_date DATE NOT NULL,
- supply_volume NUMERIC(14, 4),
- sale_volume NUMERIC(14, 4),
- leakage_volume NUMERIC(14, 4),
- nrw_rate NUMERIC(8, 2),
- leakage_rate NUMERIC(8, 2),
- mnf NUMERIC(10, 4),
- mnf_time VARCHAR(20),
- background_leakage NUMERIC(10, 4),
- burst_leakage NUMERIC(10, 4),
- alarm_level VARCHAR(20) DEFAULT 'normal',
- remark VARCHAR(500),
- deleted INTEGER DEFAULT 0,
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
-
- COMMENT ON TABLE dma_leakage_analysis IS 'DMA漏损分析表';
- COMMENT ON COLUMN dma_leakage_analysis.nrw_rate IS '产销差率(%)';
- COMMENT ON COLUMN dma_leakage_analysis.leakage_rate IS '漏损率(%)';
- COMMENT ON COLUMN dma_leakage_analysis.mnf IS '最小夜间流量(m³/h)';
- COMMENT ON COLUMN dma_leakage_analysis.alarm_level IS '报警级别: normal/warning/critical';
-
- CREATE INDEX IF NOT EXISTS idx_leakage_zone_date ON dma_leakage_analysis(zone_id, analysis_date);
- CREATE UNIQUE INDEX IF NOT EXISTS uk_leakage_zone_date ON dma_leakage_analysis(zone_id, analysis_date) WHERE deleted = 0;
-
- -- 水平衡表
- CREATE TABLE IF NOT EXISTS dma_water_balance (
- id BIGSERIAL PRIMARY KEY,
- zone_id BIGINT NOT NULL REFERENCES dma_zone(id),
- period VARCHAR(20) NOT NULL,
- stat_date DATE NOT NULL,
- total_supply NUMERIC(14, 4),
- total_sale NUMERIC(14, 4),
- billing_sale NUMERIC(14, 4),
- free_supply NUMERIC(14, 4),
- apparent_loss NUMERIC(14, 4),
- real_loss NUMERIC(14, 4),
- background_loss NUMERIC(14, 4),
- burst_loss NUMERIC(14, 4),
- total_loss NUMERIC(14, 4),
- nrw_rate NUMERIC(8, 2),
- leakage_rate NUMERIC(8, 2),
- remark VARCHAR(500),
- deleted INTEGER DEFAULT 0,
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
-
- COMMENT ON TABLE dma_water_balance IS '水平衡表';
- COMMENT ON COLUMN dma_water_balance.period IS '统计周期: daily/monthly/yearly';
- COMMENT ON COLUMN dma_water_balance.apparent_loss IS '表观漏损(m³) - 计量误差+偷水';
- COMMENT ON COLUMN dma_water_balance.real_loss IS '实际漏损(m³) - 物理漏损';
-
- CREATE INDEX IF NOT EXISTS idx_balance_zone_date ON dma_water_balance(zone_id, stat_date);
- CREATE INDEX IF NOT EXISTS idx_balance_period ON dma_water_balance(period);
|