我觉得你应该从一个简单的、规范化的架构开始,特别是因为你是新手。比如这样:
CREATE TABLE product_data
(
product TEXT,
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[],
PRIMARY KEY (product, day);
);
您可以构建视图和索引来使查询该表变得较为容易。(我在
http://ejrh.wordpress.com/2011/03/20/vector-denormalisation-in-postgresql/上写了一篇关于这种技术的博客文章。)但我的建议仍然是:从一个简单的表开始,然后在需要时探索提高效率的方法。
hstore
不是这项工作的好选择。如果时间值在hstore
中,您无法有效地使用b-tree索引。更重要的是,更新hstore
将需要在新的行版本中重新编写整个hstore
,与仅在子表中插入/更新/删除单个值相比,这非常昂贵。如果值在hstore
中,则无法使用排除约束来防止时间重叠。我看不出在这里使用hstore
的理由,但有很多不使用的理由。 - Craig Ringer