我是postgres的新手,正在试验hstore扩展.请寻求一些指导.我需要支持我们销售的各种产品的时间序列数据的基本报告.我为每个产品提供了"Timestamp,Value"格式的大量数据.每个产品的csv文件中都有这些数据.
我正在考虑使用hstore以键值格式存储这些数据.假设单个产品的所有时间序列数据都可以存储在单个hstore对象中.我需要能够按特定时间查询这些数据,比如在给定时间产品的价值是多少?还需要运行简单的查询,例如检索产品成本超过100美元的时间.我打算有一个包含产品ID列和hstore列的表.但我不清楚如何使这项工作:
我确实认为您应该首先从一个简单的规范化模式开始,尤其是因为您是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);
);
Run Code Online (Sandbox Code Playgroud)
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);
);
Run Code Online (Sandbox Code Playgroud)
您可以构造视图和索引,以使查询该表变得容易。(我在http://ejrh.wordpress.com/2011/03/20/vector-denormalisation-in-postgresql/中撰写了有关此技术的博客文章。)
但是我的建议仍然是:从一个简单的表开始,然后在知道需要使用它们时探索提高效率的方法。
| 归档时间: |
|
| 查看次数: |
2747 次 |
| 最近记录: |