2017-02-27 48 views
0

我正在用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是朝着正確方向邁出的一步,但我認爲您可以通過減少列數來進一步規範化它,並添加時間戳列。 –

回答

1

只有一個理智的答案:

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

謝謝,這看起來好多了。我知道我錯過了一些明顯的東西。我唯一的問題是,我實際上沒有任何開始或結束日期,再加上,在一天內有幾場比賽。我只有它發生的那一年,它所做的一週以及比賽的順序進來。我是否應該放置任意時間以便搜索? –

相關問題