【问题标题】:Postgres hstore for time series用于时间序列的 Postgres hstore
【发布时间】:2012-11-02 08:53:50
【问题描述】:

我是 postgres 的新手,正在尝试使用 hstore 扩展。寻求一些指导。我需要支持我们销售的各种产品的时间序列数据的基本报告。对于每种产品,我都有大量“时间戳,值”格式的数据。该数据在每个产品的 csv 文件中可用。

我正在考虑使用 hstore 以键值格式存储这些数据。假设单个产品的所有时间序列数据都可以存储在单个 hstore 对象中。我需要能够在特定时间查询这些数据,比如在给定时间产品的价值是多少?还需要运行简单的查询,例如检索产品价格超过 100 美元的时间。 我打算有一个包含产品 id 列和 hstore 列的表。但我不太清楚如何使这项工作:

  1. 需要从 csv 中存在的数千个时间戳、值记录加载 hstore 列。每当我们获得新的 csv 时,都应该附加 hstore。
  2. 该表需要存储productId和对应的Timeseries数据。 您能否告知使用 hstore 是否有帮助?如果是,那么我如何从 csv 加载数据,如上所述。此外,如果随着数据的增长对 hstore 中的插入/更新性能有任何影响,请分享您的经验。

【问题讨论】:

  • 我同意 Edmnud 的观点。 hstore 不是这份工作的好选择。如果时间值在 hstore 中,您将无法有效地对时间值使用 b-tree 索引。更重要的是,更新 hstore 将需要在新的行版本中重写整个 hstore,与仅在子表中插入/更新/删除单个值相比,这是非常昂贵的。如果值在 hstore 中,则不能使用排除约束来防止时间重叠。我认为没有理由在这里使用 hstore,也没有理由不使用。

标签: postgresql hstore


【解决方案1】:

我确实认为您应该首先从一个简单的规范化模式开始,尤其是因为您是 PostgreSQL 新手。比如:

CREATE TABLE product_data
(
    product TEXT,  -- I'm making an assumption about the types of your columns
    time TIMESTAMP,
    value DOUBLE PRECISION,

    PRIMARY KEY (product, time);
);

我肯定会牢记hstore 和类似选项,如果当您的数据变得足够大时,效率变得更加重要和简单。但请注意,所有选项都需要权衡效率。

您知道要支持多少数据吗?产品数量,每个产品的不同时间戳的数量?

您还想运行哪些其他查询?如果产品有许多不同的时间戳,查询单个产品价格超过 100 美元的时间将受益于(product, value) 上的索引。

其他选项

hstore 如果您想在一行中存储一组任意键值对的表集,则最有用。您可以在这里使用它,每个产品都有一行,并且该产品的每个不同时间戳都是产品表中的键。缺点是hstore 中的键和值是文本,而您的键是时间戳,而您的值是某种数字。所以类型检查会有一定的减少,需要的类型转换成本也会有一定的增加。另一个可能的缺点是hstore 上的某些查询可能无法非常有效地使用索引。上表可以使用简单的 btree 索引进行范围查询(假设您想提取产品的两个日期之间的值)。但是 hstore 索引的限制要大得多;您可以在 hstore 列上使用 gist 或 gin 索引来查找具有特定键的所有行。

另一个选项(我已经在我的一些数据库中使用并实验性地使用过)是数组。基本上,每个产品都有一个值数组,每个时间戳映射到数组中的一个索引。如果时间戳完全规则,这很容易。例如,如果您的所有产品每天每小时都有一个值,您可以使用这样的表格:

CREATE TABLE product_data
(
    product TEXT,
    day DATE,
    values DOUBLE PRECISION[], -- An array from 0 to 23.

    PRIMARY KEY (product, day);
);

您可以构造视图和索引以使查询此表变得容易。 (我在http://ejrh.wordpress.com/2011/03/20/vector-denormalisation-in-postgresql/ 写了一篇关于这种技术的博文。)

但我的建议仍然是:从一个简单的表格开始,然后在您知道自己需要它们时探索提高效率的方法。

【讨论】:

  • 感谢 Edmund 和 Craig,非常有用的信息。我们需要支持多达一百万种产品,并且对于每种产品,我们需要随着时间的推移存储多达 10 个不同的属性,例如:成本、浏览量、客户数量等。收集数据的频率是可变的,并在产品级别。它不是一个恒定的频率,但我们需要计划一个频率低至每 5 分钟 ~ 525600 个产品的值。看起来在使用 hstore 时会出现读写问题。我们需要支持长达一年的报告。有任何想法吗?请指教。
猜你喜欢
  • 2014-10-25
  • 2016-07-17
  • 2013-09-29
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 2013-10-26
相关资源
最近更新 更多