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

2024-05-17 06:34:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

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

我心目中最简单的结构是为每个赛道有一个单独的表,然后每一行/每一个条目都将是该赛道上的一个比赛会话。此表中的字段将是上面的变量。在

我的问题是:

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

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

任何想法都将不胜感激


Tags: csv数据用户信息数据库应用程序游戏列表
1条回答
网友
1楼 · 发布于 2024-05-17 06:34:54

有一件事可以帮助您处理大型表,那就是分区。根据您为您的问题设置的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)列创建一个索引,这样查找关于一个race会话的数据(并对其进行排序)会很快。在

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

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

编辑:

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

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

相关问题 更多 >