什么是存储历史数据的正确数据库结构?

什么是存储历史数据的正确数据库结构?

问题描述:

我正在用Sqlite设计一个数据库,旨在帮助为FIRST机器人大赛创建预测算法。从表面上看,事情看起来很容易,但我正在努力解决一个问题:如何存储团队过去的评级。我查看了以前关于如何存储历史数据的问题,但我不确定这些问题对我的情况是否适用(尽管可能肯定是我对此不太了解)。什么是存储历史数据的正确数据库结构?

每个球队都有个人评分,并且在每场比赛之后,球队参与评分都会得到修正。现在,我可以通过几种方式来存储它们,但没有一个看起来特别好。我会通过我想过的那些,没有特别的顺序。

选项1

每支球队都有它自己的table.It将包括match_id和之后的比赛做了,之前可能可能还包括评级的评级。问题是,会有10,000张桌子接壤。我非常确定这是低效率的,特别是考虑到我认为它也没有标准化(纠正我,如果我错了)。

表名:TEAM_ID

match_id | rating_after 

选项2

每队历史得分等级或存储在匹配表,和额定电流存储在球队表。球队表的简化版本是这样的:

表:TEAM_LIST

team_id | team_name | team_rating 

这并不是真正的问题,问题是与历史数据。历史数据将与比赛一起存储。有可能,这将是每场比赛之前的比赛评分。

我与这个问题有关的问题是,搜索的难度是多大,以找到以前的评级。这来自FRC如何工作的结构。每队有3支球队(组成所谓的联盟),共有6支球队。 (这些联盟通常用红色和蓝色来表示) 这些联盟是提前随机分配的,可以包括任何一方在比赛中的任何球队。)换句话说,比赛表看起来像这样(简化) :

表:match_table

match_id | Red1 | Red2 | Red3 | Blue1 | Blue2 | Blue3 | RedScore | BlueScore | Red1Rating | Red2Rating | etc..... 

所以每个团队必须包括在比赛的信息,以及为每个团队的评级。如果要创建多个评级(例如,我希望进行纯比较测试的更新评级设计),事情可能会非常快地堵塞。

为了找到团队#67的先前评级,例如,我必须搜索Red1,Red2,Red3,Blue1等,然后查看与该位置有关的列,确定这确实是最近的比赛。

注意:这可能涉及不仅知道数据的年份,数据的一周(我会从一个事件表中获取这个数据),而是匹配级别(无论是资格还是季后赛) ),并匹配#(不是match_id)。

当然,这个选项是标准化的,但它也有一个奇怪的搜索模式,从前端的角度来看并不容易(我可能会为将来的某些数据构建一个前端,所以我想也要记住这一点)。

我的问题:有没有更容易/更有效的选项,我失踪了?

因为两种设计都感觉效率不高。第一个表格太多了,另一个表格会有超过10万个条目,并且必须以复杂的模式进行搜索。我感觉好像有一些简单的设计解决方案,我根本没有想到。

+0

选项1是可怕的,不会缩放,并将是一个噩梦来查询。选项2是朝着正确方向迈出的一步,但我认为您可以通过减少列数来进一步规范化它,并添加时间戳列。 –

只有一个理智的答案:

team_rating: 
team_id, rating, start_date, end_date 

制作使用团队为第一等级的起始日期的创建日期关闭所有范围,有的随意遥远的未来日期(例如2199年1月1日)为当前行的end_date。所有日期都包含在内。

查询来寻找评分在任何日期都那么简单

select rating 
from team_rating 
where team_id = $id 
and $date between start_date and end_date 

与评级历史只是

select start_date, rating 
from team_rating 
where team_id = $id 
order by start_date 

这是关键,这两个开始和结束日期的存储,否则查询是trainwrecks。

+0

谢谢,这看起来好多了。我知道我错过了一些明显的东西。我唯一的问题是,我实际上没有任何开始或结束日期,再加上,在一天内有几场比赛。我只有它发生的那一年,它所做的一周以及比赛的顺序进来。我是否应该放置任意时间以便搜索? –