基于您提供的遥测数据数仓设计方案,我将为您创建TimescaleDB中的表格语法,包括三个维度表和一个转换为超表的事实表。
CREATE TABLE DimTime (
TimestampKey BIGINT PRIMARY KEY,
FullDateTime TIMESTAMP NOT NULL,
Date DATE NOT NULL,
Year INTEGER NOT NULL,
Quarter INTEGER NOT NULL,
Month INTEGER NOT NULL,
DayOfMonth INTEGER NOT NULL,
DayOfWeek INTEGER NOT NULL,
WeekOfYear INTEGER NOT NULL,
Hour INTEGER NOT NULL,
Minute INTEGER NOT NULL,
TimeOfDay VARCHAR(20) NOT NULL,
IsWeekend BOOLEAN NOT NULL
);
-- 创建索引优化查询
CREATE INDEX idx_dimtime_date ON DimTime(Date);
CREATE INDEX idx_dimtime_fulldatetime ON DimTime(FullDateTime);
CREATE TABLE DimXTU (
XTUKey BIGINT PRIMARY KEY,
XTU_ID VARCHAR(50) NOT NULL UNIQUE,
XTU_Model VARCHAR(100),
Substation VARCHAR(200),
IP_Address VARCHAR(50),
InstallationDate DATE,
Status VARCHAR(50)
);
-- 创建索引优化查询
CREATE INDEX idx_dimxtu_xtu_id ON DimXTU(XTU_ID);
CREATE TABLE DimFTU (
FTUKey BIGINT PRIMARY KEY,
FTU_ID VARCHAR(50) NOT NULL,
XTUKey BIGINT NOT NULL REFERENCES DimXTU(XTUKey),
FTU_Model VARCHAR(100),
InstallationDate DATE,
LocationDescription VARCHAR(200),
Latitude DECIMAL(10, 6),
Longitude DECIMAL(10, 6),
Status VARCHAR(50),
EffectiveStartDate DATE NOT NULL,
EffectiveEndDate DATE,
IsCurrent BOOLEAN NOT NULL,
CONSTRAINT uk_ftu_id_effective UNIQUE (FTU_ID, EffectiveStartDate)
);
-- 创建索引优化查询
CREATE INDEX idx_dimftu_ftu_id ON DimFTU(FTU_ID);
CREATE INDEX idx_dimftu_xtukey ON DimFTU(XTUKey);
CREATE INDEX idx_dimftu_current ON DimFTU(IsCurrent);
CREATE TABLE FactPowerReadings (
-- 主键和外键
TimestampKey BIGINT NOT NULL REFERENCES DimTime(TimestampKey),
FTUKey BIGINT NOT NULL REFERENCES DimFTU(FTUKey),
ReadingTimestamp TIMESTAMP NOT NULL,
-- 电压指标
UAB_Voltage DECIMAL(10, 2),
UBC_Voltage DECIMAL(10, 2),
UCA_Voltage DECIMAL(10, 2),
UA_Voltage DECIMAL(10, 2),
UB_Voltage DECIMAL(10, 2),
UC_Voltage DECIMAL(10, 2),
-- 电流指标
IA_Current DECIMAL(10, 2),
IB_Current DECIMAL(10, 2),
IC_Current DECIMAL(10, 2),
I0_Current DECIMAL(10, 2),
-- 功率指标
ActivePower_Total DECIMAL(10, 2),
ActivePower_A DECIMAL(10, 2),
ActivePower_B DECIMAL(10, 2),
ActivePower_C DECIMAL(10, 2),
ReactivePower_Total DECIMAL(10, 2),
ReactivePower_A DECIMAL(10, 2),
ReactivePower_B DECIMAL(10, 2),
ReactivePower_C DECIMAL(10, 2),
ApparentPower_Total DECIMAL(10, 2),
ApparentPower_A DECIMAL(10, 2),
ApparentPower_B DECIMAL(10, 2),
ApparentPower_C DECIMAL(10, 2),
-- 元数据
LoadTimestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- 复合主键
PRIMARY KEY (ReadingTimestamp, FTUKey)
);
-- 将表转换为超表,根据ReadingTimestamp进行时间分区
SELECT create_hypertable('FactPowerReadings', 'ReadingTimestamp',
chunk_time_interval => INTERVAL '1 day');
-- 创建复合索引优化查询性能
CREATE INDEX idx_factpowerreadings_ftutimestamp ON FactPowerReadings(FTUKey, ReadingTimestamp DESC);
CREATE INDEX idx_factpowerreadings_timestamp ON FactPowerReadings(ReadingTimestamp DESC);
超表转换:
FactPowerReadings
表转换为TimescaleDB的超表,使用ReadingTimestamp
作为时间分区列数据类型选择:
DECIMAL(10,2)
以确保精确度BIGINT
作为主键/外键以支持大量数据索引设计:
FactPowerReadings
创建了复合索引以加速按设备和时间的查询SCD Type 2:
DimFTU
表包含了对缓慢变化维度(SCD Type 2)的支持,通过EffectiveStartDate
、EffectiveEndDate
和IsCurrent
字段这些表格设计遵循了您的数据仓库星型模式,并利用了TimescaleDB的特性来优化时间序列数据的存储和查询性能。