Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django数据库规划-时间序列数据_Python_Django_Database_Postgresql_Time Series - Fatal编程技术网

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

Python Django数据库规划-时间序列数据,python,django,database,postgresql,time-series,Python,Django,Database,Postgresql,Time Series,我想了解一些关于如何最好地组织django模型/数据库表以保存webapp中的数据的建议 我正在设计一个网站,它可以保存用户从赛车模拟游戏中获得的遥测数据。因此,将有一个桌面伴侣应用程序,每0.1秒采集一次游戏数据,获取各种信息(汽车、赛道、速度、汽油、刹车、离合器、转速等)。例如,在2分钟的比赛中,每个变量将保存1200个数据点(每秒10个样本*120秒) 这里重要的一点是,这个数据列表可以有多达20个变量,并且在未来可能会增长。因此,1200*变量的数量是单个比赛会话的数据量。如果一个用户提

我想了解一些关于如何最好地组织django模型/数据库表以保存webapp中的数据的建议

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

这里重要的一点是,这个数据列表可以有多达20个变量,并且在未来可能会增长。因此,1200*变量的数量是单个比赛会话的数据量。如果一个用户提交了100个会话,并且有100个用户……那么数据量会迅速增加

然后,该应用程序会将比赛期间的所有数据发送到网站的数据库中。数据必须通过CSV文件在游戏和网站之间传输。因此,在结构上,我仅限于CSV可以做什么。然后,该网站将允许您选择一个比赛时段/圈,并将此信息绘制在单独的时间序列图上(针对每个变量),重要的是,允许您将您的时段与其他人的时段进行对比,以了解差异所在

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

我心目中最简单的结构是为每条赛道设置一个单独的表格,然后每条赛道上的每一行/每一条赛道都将是一个赛道。此表中的字段将是上述变量

我的问题是:

1) 上面列表中的大多数变量是时间序列数据,而不是单个值(例如,var速度可能看起来像:70、72、74、77、72、71、65,其中这些值是在整个圈中间隔0.1秒的样本)。如何在表/字段中存储此类信息

2) 上面列表中每个变量的长度在任何一场比赛中都是相同的(如果你的圈数为1分钟35,那么你所有的变量将只捕获该时间长度的数据),但是考虑到我希望能够相互比较不同的圈数,每圈的会话时间将不同。换句话说,不管我如何存储这些变量的时间序列数据,它的大小必须是可变的


任何想法都将不胜感激

一件可以帮助您处理大型表的事情是分区。根据您为问题设置的postgresql标记判断,请看这里:

但首先,我将使用一个简单的表,由一组合理的索引支持。据我所知,表中的每个数据项都将由比赛会话id、球员id和时间指示器标识。根据查询要求,这些列应该包含索引

关于你的两个问题: 1) 将这些信息存储为简单整数。请记住为这些列设置适当的数据类型。例如,如果您100%确定某些值非常小,则可以使用
smallint
数据类型。有关整数数据类型的详细信息,请参见:

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\u id、race\u id、time)列创建索引,以便快速查找有关一个竞赛会话的数据(并对其进行排序)

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

如果决定向集合中添加新变量,只需向表中添加一个新列即可

编辑:

最后,您将得到一个至少包含以下列的表: user_id-指定此行涉及哪些用户数据。 race_id-指定此行涉及的比赛数据。 时间-确定表示数据的正确顺序


这样,当你想获得关于乔的第五场比赛的信息时,你可以查找那些有
user\u id='Joe\u id'和race\u id=5
的行,然后按时间列对所有这些行进行排序。

因此,也许我不理解,或者我之前没有正确描述问题,但是在你的django模型中,你有(例如)气体和速度作为包含单个值的字段。然而,在我的例子中,对于每一场比赛,汽油和速度都需要是各自的时间序列。因为在整个比赛期间,我需要每0.1秒记录一次运动员的速度-这意味着速度场需要保持1000+个有序值(即该比赛每0.1秒记录一次运动员的速度)。如何将这样的内容放入intfield?不能将1000+个值压缩到一个字段中。您可以创建1000多个RaceTelemetryData对象,从而在数据库表中产生1000多行。每0.1秒比赛一次。然后,如果需要,可以迭代这些对象来创建一个数组,或者使用显式SQL查询表。啊,我明白了,如果表中有1000多行,那么表本身代表一个竞赛会话。这意味着在整个网站上,你最终会得到数十万张表格(每个提交的比赛一张)。这是一种比将整个时间序列(可能是json字符串)拟合到单个字段中并拥有更少的表更可取的方法?我没有太多数据库的经验,所以这是诚实的,只是所有新的梅回答编辑。您只有一个表,而该表中的每一行都包含识别该表所涉及的用户所需的数据