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

时间:2017-02-27 03:55:32

标签: database sqlite database-design

我正在设计一个Sqlite数据库,旨在帮助促进FIRST机器人竞赛的预测算法的创建。从表面上看,事情看起来很简单,但我正在努力解决一个问题:如何存储过去的团队评级。我已经查看过以前有关如何存储历史数据的问题,但我不确定它是否适用于我的情况(尽管它可能肯定是我不太了解它)。

每个团队都有一个单独的评级,并且每次比赛后团队参与评级都会被修改。现在,有几种方法可以存储它们,但它们中没有一种看起来特别好。我会仔细阅读那些经过深思熟虑的事情。

选项1

每个团队都拥有自己的桌子。匹配完成后会包含match_id和评级,并且可能还包括之前的评分。问题是,10,000个表格会接近。我很确定这是低效的,特别是考虑到我相信它也是非标准化的(如果我错了,请纠正我)。

表名:Team_id

match_id | rating_after

选项2

每个团队的历史评级或存储在匹配表中,当前评级存储在团队表中。团队表的简化版本如下所示:

表:Team_list

team_id | team_name | team_rating

这不是真正的问题,问题在于历史数据。历史数据将与匹配一起存储。可能会在比赛前对每支球队进行评分。

我遇到的问题是,搜索到以前的评分是多么困难。这来自FRC的工作原理。共有6支球队,每支球队共有3支队伍(形成所谓的联盟)。 (这些联盟通常用红色和蓝色表示) 这些联盟是提前随机分配的,可以包括任何一方参加比赛的球队。)换句话说,比赛表看起来像这样(简化):

表:match_table

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

因此,每支球队都必须参与比赛信息,以及每支球队的评分。如果要创建多个评级(例如我想要进行纯对比测试的更新评级设计),事情可能会非常快速地堵塞。

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

注意:这可能不仅需要知道数据的年份,它被采用的那一周(我会从一个事件表的连接中获得这些数据),而是匹配级别(无论是资格还是季后赛) ,并匹配#(不是match_id)。

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

我的问题:我缺少一个更简单/更有效的选项吗?

因为两种设计都感觉效率低下。第一个表有太多表,另一个表有超过100,000个表,必须以复杂的模式进行搜索。我觉得好像有一些我根本没有想过的简单设计解决方案。

1 个答案:

答案 0 :(得分:1)

只有一个明智的答案:

team_rating:
team_id, rating, start_date, end_date

使用团队的创建日期作为第一个评级的start_date以及一些任意遥远的未来日期(例如2199-01-01)作为当前行的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

关键是存储开始和结束日期,否则查询是火车残骸。