Postgres hstore的时间序列

时间:2012-11-13 21:22:16

标签: postgresql hstore

我是postgres的新手,正在尝试使用hstore扩展。请寻求一些指导。我需要支持我们销售的各种产品的时间序列数据的基本报告。我为每个产品提供了“Timestamp,Value”格式的大量数据。这些数据可在每个产品的csv文件中找到。

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

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

1 个答案:

答案 0 :(得分:4)

我认为你应该先从一个简单的规范化模式开始,特别是因为你是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/写了一篇关于这种技术的博客文章。)

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

相关问题