我确实认为您应该首先从一个简单的规范化模式开始,特别是因为您是 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/上写了一篇关于这项技术的博文。)
但我的建议仍然是:从一个简单的表格开始,然后在您知道自己需要它们时探索提高效率的方法。