我是postgres的新手,正在尝试使用hstore扩展。请寻求一些指导。我需要支持我们销售的各种产品的时间序列数据的基本报告。我为每个产品提供了“Timestamp,Value”格式的大量数据。这些数据可在每个产品的csv文件中找到。
我正在考虑使用hstore以键值格式存储此数据。假设单个产品的所有时间序列数据都可以存储在单个hstore对象中。我需要能够按特定时间查询这些数据,比如在给定时间产品的价值是多少?还需要运行简单的查询,例如检索产品成本超过100美元的时间。 我打算有一个包含产品ID列和hstore列的表。但我不清楚如何使这项工作:
答案 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/写了一篇关于这种技术的博客文章。)
但我的建议仍然是:从一个简单的表开始,然后在你知道自己需要它们时探索提高效率的方法。