6

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

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

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

1 回答 1

5

我确实认为您应该首先从一个简单的规范化模式开始,特别是因为您是 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如果您的数据变得足够大以至于效率变得更加重要和简单,我肯定会记住类似的选项。但请注意,所有选项都有效率权衡。

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

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

其他选项

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/上写了一篇关于这项技术的博文。)

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

于 2012-11-14T00:06:44.243 回答