【问题标题】:Best practice on normalization规范化的最佳实践
【发布时间】:2021-07-15 22:59:37
【问题描述】:

我想知道是否有关于时间序列数据标准化的最佳做法。 我在 TimescaleDB 中有一个看起来像这样的超表

                      Table "public.mainsfrequency"
  Column  |            Type             | Collation | Nullable | Default
----------+-----------------------------+-----------+----------+---------
 time     | timestamp without time zone |           | not null |
 host     | text                        |           |          |
 location | text                        |           |          |
 freq     | double precision            |           |          |

hostlocation 标准化为单独的(非超)表并在上述超表中使用外键是个好主意吗?我读过不支持使用外键引用超表,但是另一个方向呢?

【问题讨论】:

    标签: timescaledb


    【解决方案1】:

    正确,它可以在超表中创建外键以引用普通(非超)表,但不是相反。所以这会起作用:

    CREATE TABLE host(
      id INT PRIMARY KEY,
      host TEXT,
      location TEXT
    );
    CREATE TABLE mainsfrequency(
      time TIMESTAMP NOT NULL,
      host_id INT REFERENCES hosts(host_id),
      freq DOUBLE PRECISION
    );
    SELECT create_hypertable('mainsfrequency','time');
    

    当您决定将hostlocation 值存储在超表中还是将其移动到单独的表中时,请考虑将存储多少数据、值的唯一性、查询数据的方式以及如何使用超表。

    例如,如果文本重复很多,则每行重复的主机名和位置文本将比存储在单独的表中占用更多的空间。但是,如果您将使用compression,那么您可以节省大量空间,同时将值保留在超表中。

    如果您将使用continuous aggregates 来计算和存储聚合,那么您只能使用存储在超表中的值,因为连续聚合不支持连接。例如,如果您想具体化某些位置的聚合,那么如果该位置存储在单独的表中,则无法实现。

    所以下面的查询不能放入连续聚合中:

    SELECT time_bucket(INTERVAL '1h', time), host, AVG(freq)
    FROM mainsfrequency, host
    WHERE host_id = id AND location = 'NY'
    GROUP BY 1, 2;
    

    要在连续聚合中进行此类查询,它将是:

    CREATE TABLE mainsfrequency(
      time TIMESTAMP NOT NULL,
      host TEXT,
      location TEXT,
      freq DOUBLE PRECISION
    );
    SELECT create_hypertable('mainsfrequency','time');
    
    CREATE MATERIALIZED VIEW mainsfrequency_hourly
    WITH (timescaledb.continuous) AS
    SELECT time_bucket(INTERVAL '1h', time), host, AVG(freq)
    FROM mainsfrequency
    WHERE location = 'NY'
    GROUP BY 1, 2;
    

    【讨论】:

    • 这是一个详细的答案!很棒,很有帮助,尤其是关于连续聚合的提示。
    猜你喜欢
    • 2018-04-03
    • 2010-10-25
    • 1970-01-01
    • 2013-09-30
    • 2011-12-30
    • 1970-01-01
    • 2011-10-31
    • 2018-08-29
    • 2015-05-19
    相关资源
    最近更新 更多