<p>如果我正确理解您的想法,那么您正在考虑将时间序列存储在PostgreSQL中,一个时间序列记录存储在一个数据库行中。别那么做。</p>
<p>一方面,这个问题是理论上的。关系数据库(我认为大多数数据库)基于行独立的前提,而时间序列的记录是物理顺序的。当然,数据库索引为数据库表提供了某种顺序,但这种顺序是为了加快搜索速度或按字母顺序或其他某种顺序显示结果;它并不意味着这种顺序有任何自然含义。无论您如何订购它们,每个客户都是独立于其他客户的,每个客户的购买都是独立于其他客户的购买,即使您可以按时间顺序获得它们,以形成客户的购买历史。时间序列记录之间的相互依赖性更强,这使得关系数据库变得不合适。</p>
<p>实际上,这意味着表及其索引所占用的磁盘空间将非常大(可能比将时间序列存储在文件中大20倍),从数据库中读取时间序列将非常慢,大约比存储在文件中慢一个数量级。它也不会给你带来任何重要的好处。您可能永远不会执行查询“将值大于X的所有时间序列记录都提供给我”。如果您需要这样一个查询,您还需要一个关系数据库没有设计来执行的地狱般的其他分析,因此您无论如何都会将整个时间序列读入某个对象。</p>
<p>所以每个时间序列都应该作为一个文件存储。它可能是文件系统上的文件,也可能是数据库中的blob。尽管我已经<a href="http://pthelma.readthedocs.org/en/latest/timeseries.html#streaming-formats-for-timeseries-objects" rel="noreferrer">implemented the latter</a>,但我相信前者更好;在Django,我会写这样的东西:</p>
<pre><code>class Timeseries(models.model):
name = models.CharField(max_length=50)
time_step = models.ForeignKey(...)
other_metadata = models.Whatever(...)
data = models.FileField(...)
</code></pre>
<p>使用<code>FileField</code>将使数据库变小,并使系统的增量备份更容易。通过在文件中查找可能不可能或很难获得的片段也会更容易。</p>
<p>现在,什么样的文件?我建议你看看熊猫。它是一个用于数学分析的python库,它支持时间序列,并且应该有一种方法将时间序列存储在文件中。</p>
<p>我把上面的链接到了我的一个图书馆,我不建议你使用;一方面它做不到你想要的(它不能处理超过一分钟的粒度,而且它还有其他缺点),另一方面它已经过时了——我在熊猫之前写的,我打算将来把它转换为使用熊猫。有一本书《数据分析用Python》,作者是pandas,我发现这本书非常有价值。</p>
<p><strong>更新:</strong>也有人涌入。从未使用过它,因此我没有意见,但如果你想知道如何存储时间序列,肯定需要检查一下。</p>