2011-06-21 8 views
1

私は、いくつかの計算のために "トップ10"の結果を保持するデータベース設計を考え出しています。基本的に、すべてが完了したら、3つの「トップ10」カテゴリがありますが、すべてが別々のテーブルになっていますが、戻って後でトップ10フラットファイルが機能するにもかかわらず、データベースの必要性があるため、これは何年ものデータを保持する可能性があります。トップ10のデータベース設計の助けが必要

ここでは、いくつかのシンプルなテーブルを持つもの以外の、データベースで深刻なことをしているので、しばらくしているので、このデザインを通していくつかの問題を考えています。誰かが私の設計を手伝ってくれたら、残りの部分を手に入れるのに十分なMySQLを知っています。

本質的に、私は10の名前のグループ、各名前が持っていた合計ポイントの%、彼らがトップ10に入れたランク、そしてそのトップ10に関連付けられた時間を保存する必要があります後でその時間のクエリ)

私はトップ10に11列、1つはID用、10個は 'Names'テーブルの外部キー用のテーブルが必要だと思いますPK、名前、%、およびランク。これは私にとっては控えめなようですが、他の誰かが提案していますか?

編集:「トップ10」は、5分間隔の特定のデータセットに関連付けられており、各間隔は以前または将来の間隔とは完全に独立しています。

答えて

2

データベースを聞きたいならば、「ジョーがトップ10にされているどのくらいの頻度で、」あなたは、フォームの代わりに

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

の10個のクエリを記述する必要がありますので、私は、あなたのソリューションをお勧めしません。 、どのようにランキング表について、フィールドを持つ:あなたは特定の日付のトップ10リストをしたい場合は

id 
Date 
Person 
Rank 

はその後、クエリが

SELECT * FROM Rankings WHERE Date = ... 
です

とあなたが誰かの歴史的な順位を知りたい場合は、クエリが

SELECT * FROM Rankings WHERE Person = ... 

であり、あなたはすべての歴史的な指導者を知りたい場合は、クエリは、この方法の欠点は、あなたということです

SELECT * FROM Rankings WHERE Rank = 1 

です誤って2人の異なる人を8位にして、データベースが異常を許す可能性があります。しかし、私はあなたに良い知らせをしています。人々は実際に8位を結ぶかもしれないので、実際には可能にしてほしいかもしれません!

+0

わかりません。名前は実際に私が照会するsyslogデータから来ています。それぞれのリストは、Top 10が探しているものに応じて独自のランキングです。データは5分のチャンクで処理され、5分のチャンクはそれぞれ独立して処理されます。したがって、5分ごとのチャンクごとに、以前の5分のグループとはまったく独立したトップ10があります。 稼働中の平均または稼働中の合計ではありません。それぞれの5分間は独立しています。しかし、はい、すべてのトップ10の中に複数の名前が表示されることがあります。私は元の質問でそれを指定したはずです。 – z0dSki

+0

提案には実行中の合計がありません。私の設計では、5分ごとにチャンクが10個のレコードがデータベースに挿入されます.10個のレコードは、「チャンクX、ボブは#1」、「チャンクXではジョーは#2でした」、チャンクXでは、ジルは#3でした」など。チャンクYを実行したときは、さらに10個のレコードを追加します。私が "時間"の代わりに "日付"を使用したという事実は、これをあなたの状況に適応させてはいけません。 –

+0

申し訳ありませんが、あなたの投稿を誤解しました。だから、あなたは単一のテーブルを提案し、トップ10を提示する日時に厳密に基づいて質問しますか?あなたは、5分ごとの間隔が長期間収集されるたびに検索/クエリに時間がかかるとは思わないでしょうか? – z0dSki

1

あなたの「トップ10」は特定の時間内のスナップショットデータであると仮定します。 「トップ10」の配列「はtop_10_detail」の列から計算することができれば、あなたのビジネスロジックは、あなたは、

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 

時間は、テーブル設計のための親エンティティであるように、「5分毎」という
  1. です列のシーケンスを保持する必要はありません。それ以外の場合は、シーケンスを永続化する列が必要です。
  2. 「過去30日間の午前12時のトップ10」などのより複雑なクエリが必要な場合は、「曜日」、「時間」、「分」に個別の列を使用するとパフォーマンスが向上します適切なインデックスで)。
関連する問題