Django数据库规划 - 时间序列数据

时间:2014-12-30 12:10:05

标签: python django database postgresql time-series

我想就如何最好地组织我的django模型/数据库表来保存我的webapp中的数据提出一些建议

我设计的网站将保存来自赛车模拟游戏的用户遥测数据。因此,将会有一个桌面伴侣应用程序,它将每0.1秒对游戏数据进行一次采样,以获取各种信息(汽车,赛道,速度,汽油,刹车,离合器,转速等)。例如,在2分钟的比赛中,每个变量将保存1200个数据点(每秒10个样本* 120秒)。

这里重要的是这个数据列表可以有多达20个变量,并且可能会在将来增长。因此1200 *您拥有的变量数量是单个竞赛会话的数据量。如果单个用户提交100个会话,并且有100个用户......数据量会非常快地增加。

然后,应用程序会将竞赛会话的所有数据发送到网站的数据库。数据必须通过CSV文件在游戏和网站之间传输。所以在结构上我只限于CSV可以做什么。然后,该网站将允许您选择比赛时间/圈数并在不同的时间序列图表上绘制此信息(针对每个变量),并且重要的是允许您针对某些人绘制会话以查看差异所在的位置

我的问题是你如何构建这样一个数据库来保存这么多信息?

我想到的最简单的结构是为每个赛道创建一个单独的表,然后每个行/条目将成为该赛道上的一个赛道。此表中的字段将是上面的变量。

我遇到的问题是:

1)上面列表中的大多数变量都是时间序列数据,而不是单个值(例如变速速度可能如下所示:70,72,74,77,72,71,65,其中值为间隔0.1秒的样本在整个圈的过程中分开)。如何在表/字段中存储此类信息?

2)上面列表中每个变量的长度对于任何单个竞赛会话总是相同的长度(如果你的一圈需要1分钟35,那么你所有的变量只能捕获那段时间内的数据),但是给出了我希望能够相互比较不同的圈数,每圈的会话时间会有所不同。换句话说,我存储这些变量的时间序列数据,它的大小必须是可变的

任何想法都将不胜感激

1 个答案:

答案 0 :(得分:2)

可以帮助您使用HUGE表的一件事是分区。根据您为问题设置的postgresql标记判断,请查看此处:http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html

但是一开始我会选择一个简单的表,由一组合理的索引支持。根据我的理解,表格中的每个数据条目都将通过比赛会话ID,玩家ID和时间指示器来识别。根据您的查询要求,这些列应该包含索引。

至于你的两个问题: 1)您将这些信息存储为简​​单整数。请记住为这些列设置正确的数据类型。对于例如如果您100%确定某些值非常小,则可以使用smallint数据类型。有关整数数据类型的更多信息,请访问:http://www.postgresql.org/docs/9.3/static/datatype-numeric.html#DATATYPE-INT

2)如果每个var列表在表格中都是不同的行,那将不会成为问题。您可以插入尽可能多的内容。

所以,总结一下。我将从一个非常简单的单表模式开始。从django的角度来看,这看起来像这样:

class RaceTelemetryData(models.Model):
  user = models.ForeignKey(..., index_db=True)
  race = models.ForeignKey(YourRaceModel, index_db=True)
  time = models.IntegerField()
  gas = models.IntegerField()
  speed = models.SmallIntegerField()
  # and so on...

另外,你应该为(​​user_id,race_id,time)列创建一个索引(手动),所以查找,关于一个竞赛会话(并对其进行排序)的数据会很快。

将来,如果您发现此单个表的性能太慢,您将能够尝试其他索引或分区。 PostgreSQL在修改现有数据库结构方面非常灵活,所以你不应该遇到很多问题。

如果您决定向集合中添加新变量,则只需向表中添加新列。

编辑:

最后,您最终得到一个表,至少包含以下列: user_id - 指定此行所关注的用户数据。 race_id - 指定此行的比赛数据。 time - 确定表示数据的正确顺序。

这样,当您想要获取有关Joe的第5场比赛的信息时,您会查找具有user_id = 'Joe_ID' and race_id = 5的行,然后按时间列对所有这些行进行排序。