2011-06-21 151 views
1

我想要拿出一個數據庫設計來保存正在完成的一些計算的「前10位」結果。基本上,當所有人都說完成後,將會有3個「前10名」類別,這些類別我都很好,但我需要能夠返回並稍後提取有關前10名的歷史數據在某些時候,因此需要數據庫,儘管平面文件可以工作,但這有可能保存數年的數據。需要數據庫設計方面的幫助前10位

現在,這已經有一段時間了,因爲我對數據庫做了任何嚴肅的事情,除了有一些簡單的表格之外,所以我在思考這個設計時遇到了一些問題。如果有人能夠幫助我設計它,我知道有足夠的MySQL來完成剩下的工作。

因此,本質上,我需要存儲:一組10個名稱,每個名稱所佔總點數的百分比,他們在前十名中的排名以及與前十名相關的時間(所以我可以後來查詢那個時間)

我想我需要一個表爲11列的前10名,一個爲ID和10名爲'名稱'表的外鍵,它擁有所有曾經用過的名字PK,姓名,%和排名。這對我來說似乎笨重,其他人有什麼建議嗎?

編輯:「前10名」與5分鐘間隔的特定數據集相關聯,每個間隔與以前或未來間隔完全無關。

回答

2

我不建議你的解決方案,因爲這時如果你要問數據庫「已被喬多久的前10名,」你必須寫形式的10個查詢

SELECT Date FROM Top10 WHERE FirstPlace = 'joe' 
SELECT Date FROM Top10 WHERE SecondPlace = 'joe' 
... 

相反,怎麼樣一個排名表,有字段:

id 
Date 
Person 
Rank 

然後如果你想十強名單的某個日期,查詢

SELECT * FROM Rankings WHERE Date = ... 

,如果你想知道一個人的歷史排名,查詢

SELECT * FROM Rankings WHERE Person = ... 

,如果你想知道所有的歷史人物,查詢

SELECT * FROM Rankings WHERE Rank = 1 

這樣做的缺點是你可能會意外地讓兩個不同的人排在第八位,而你的數據庫會允許異常。但是我對你有好消息 - 人們可能實際上排在第8位,所以你可能真的希望這是可能的!

+0

我不確定這會起作用。名稱實際上來自我查詢的syslog數據,每個數據都根據前10名尋找的自己的排名。數據在5分鐘內處理,每個5分鐘大塊被獨立處理。所以每5分鐘就有一個前10名,這些前5分鐘完全獨立。 這不是一個運行平均值或運行總值,每個5分鐘的時間段是不獨立的。但是,是的,名稱在所有前十名中可能會出現超過一次。我應該在原來的問題中指出這一點。 – z0dSki

+0

我的建議中沒有任何運行總數。按照我的設計,每個5分鐘的塊會導致10條記錄被插入到數據庫中:10條記錄對應於事實「在塊X中,鮑勃是#1」,「在塊X中,喬是#2」,「在塊X中,吉爾是#3,「等等。當你運行塊Y時,你會增加10個記錄。我用「日期」而不是「時間」這個事實不應該阻止你將它適應你的情況。 –

+0

對不起,我誤解了你的帖子。那麼你是在建議一個單一的表格並嚴格依據提交前十名的日期/時間進行查詢?每隔5分鐘收集很長一段時間後,您覺得這樣做最終會慢慢搜索/查詢? – z0dSki

1

我假設你的「前10名」是一定時間內的快照數據。和你的業務邏輯是,「每5分鐘」,這樣的時間對於表設計

top_10_history 
    th_id - the primary key 
    th_time - the time point when taking the snapshot data of "Top 10" 
top_10_detail 
    td_th_id - the FK to top_10_history 
    td_name_id - the FK to name 
    td_percentage - the "%" 
    td_rank - the rank 
  1. 如果「前10名」的順序可以從列在「top_10_detail」來計算父實體,你不需要一列來保持它的順序。否則,你需要一個列來堅持它的序列。
  2. 如果您需要更復雜的查詢,例如「過去30天中午12點的前10名」,使用「日」,「小時」和「分鐘」的單個列將是性能更好的主意有合適的索引)。