如果我正确理解您的想法,您正在考虑将时间序列存储在 PostgreSQL 中,一个时间序列记录在一个数据库行中。不要那样做。
一方面,这个问题是理论上的。关系数据库(我认为大多数数据库)是基于行独立的前提,而时间序列的记录是物理排序的。当然,数据库索引为数据库表提供了某种顺序,但这种顺序是为了加快搜索速度或按字母顺序或其他顺序显示结果;它并不暗示该顺序的任何自然意义。无论您如何订购它们,每个客户都独立于其他客户,并且每个客户的购买都独立于他的其他购买,即使您可以按时间顺序一起获得它们以形成客户的购买历史。时间序列记录的相互依赖性更强,这使得关系数据库不合适。
实际上,这意味着表及其索引占用的磁盘空间会很大(可能比将时间序列存储在文件中大 20 倍),从数据库中读取时间序列会很慢,有些比存储在文件中慢一个数量级。它也不会给你任何重要的好处。您可能永远不会进行查询“给我所有值大于 X 的时间序列记录”。如果您需要这样的查询,您还需要进行关系数据库未设计用于执行的其他分析,因此无论如何您都会将整个时间序列读入某个对象。
所以每个时间序列都应该存储为一个文件。它可能是文件系统上的一个文件,也可能是数据库中的一个 blob。尽管我有implemented the latter,但我相信前者更好;在 Django 中,我会这样写:
class Timeseries(models.model):
name = models.CharField(max_length=50)
time_step = models.ForeignKey(...)
other_metadata = models.Whatever(...)
data = models.FileField(...)
使用FileField 将使您的数据库更小,并且更容易对系统进行增量备份。通过在文件中查找也可以更容易地获得切片,这对于 blob 来说可能是不可能或困难的。
现在,什么样的文件?我建议你看看熊猫。这是一个用于数学分析的python库,支持时间序列,它还应该有一种将时间序列存储在文件中的方法。
我在上面链接到我不建议您使用的库;一方面它没有做你想做的事(它不能处理比一分钟更精细的粒度,而且它还有其他缺点),另一方面它已经过时了——我在 pandas 之前写过它,我打算转换它将来使用熊猫。 pandas 的作者有一本书,《Python for data analysis》,我觉得这本书很有价值。
更新(2016 年): 还有 InfluxDB。从未使用过它,因此我没有意见,但如果您想知道如何存储时间序列,这绝对是您需要检查的东西。
更新(2020-02-07):还有 TimescaleDB,一个 PostgreSQL 的扩展。
更新(2020-08-07):我们(再次)更改了我们的软件,以便它使用 TimescaleDB 将数据存储在数据库中。我们已经精通 PostgreSQL,学习一些 TimescaleDB 很容易。最重要的具体优势是我们可以进行诸如“查找 2019 年 24 小时内降雨 >50 毫米的所有位置”之类的查询,这在将数据存储在平面文件中时会非常困难。另一个优点是完整性检查——多年来,由于到处都有小错误,我们有一些带有重复行的时间序列。缺点也很明显。它使用了 10 倍以上的磁盘空间。因此,我们可能需要更改我们的 PostgreSQL 备份策略。它更慢。检索具有 30 万条记录的时间序列可能需要一秒钟。这是之前的瞬间。我们需要实现缓存以检索时间序列,而这在以前是不需要的。