基于您提供的遥测数据数仓设计方案,我将为您创建TimescaleDB中的表格语法,包括三个维度表和一个转换为超表的事实表。

TimescaleDB表格创建语法

1. 维度表 DimTime (时间维度表)

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

2. 维度表 DimXTU (XTU设备维度表)

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

3. 维度表 DimFTU (FTU设备维度表)

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

4. 事实表 FactPowerReadings (转换为超表)

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

说明

  1. 超表转换

    • 我将FactPowerReadings表转换为TimescaleDB的超表,使用ReadingTimestamp作为时间分区列
    • 设置了1天的分区间隔,这对15分钟一次的数据是合适的
    • 这将极大提高时间序列查询性能
  2. 数据类型选择

    • 对于电气测量值使用DECIMAL(10,2)以确保精确度
    • 使用BIGINT作为主键/外键以支持大量数据
  3. 索引设计

    • 为各个表创建了适当的索引以优化查询性能
    • FactPowerReadings创建了复合索引以加速按设备和时间的查询
  4. SCD Type 2

    • DimFTU表包含了对缓慢变化维度(SCD Type 2)的支持,通过EffectiveStartDateEffectiveEndDateIsCurrent字段

这些表格设计遵循了您的数据仓库星型模式,并利用了TimescaleDB的特性来优化时间序列数据的存储和查询性能。