Files

137 lines
5.8 KiB
SQL
Raw Permalink Normal View History

-- =====================================================
-- 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);