137 lines
5.8 KiB
SQL
137 lines
5.8 KiB
SQL
-- =====================================================
|
|||
|
|
-- 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);
|