2012-04-26 11 views
0

JVMに変換中の従来のLAMPアプリケーションがあります。MySQL:単一列SUM(IF(cond、a、b))vs muti-column Sum()

問題は、@ 250Kレコードのスコアリングテーブルを必要とします。現時点では、「scoreType」列はtinyintとして表されます。ここで、1 = goal、2 = assist1、3 = assist2です。得点リーダーのための

、各プレイヤーの目標/ assist1/assist2合計を取得するには、クエリのスニペットは次のようになります。

SUM(IF(scoreType=1,1,0)) AS goals, SUM(IF(scoreType=2,1,IF(scoreType=3,1,0))) AS assists 

十分フェア、仕事をしていませんが、私は、ifの条件でを思ったんだけどクエリコンテキストがSUM、COUNTなどの操作を伴う一般的なスキーマ設計では、tinyintのアプローチではなく、goal/assist1/assist2、win/loss/tieなどの限定された選択セットを別々の列に分割する方が良いでしょうか?

は別々の列では、クエリは、次のようになります。パフォーマンスの勝利(不要のためであれば(指揮、a、b)は試合)わずかに増加ストレージのコストで(3列対をある

SUM(goal) AS goal, SUM(assist1) AS assist1, SUM(assist2) AS assist2 

を1)。

アプリケーション層では、ORMサポートされていないSUM(if())からcolumn.Sum()に移動する可能性があります。それ以外の場合は、静的に型指定されていない文字列のSQLクエリをオールインワン列の手法で保持する必要があります。

あなたはどのように扱いますか、そのまま残しておくか、DBとアプリケーションコードを3列アプローチに移行しますか?

フィードバックありがとうございます!

答えて

1
SELECT scoreType, COUNT(scoreType) 
FROM ... 
GROUP BY scoreType 

それはありませんか?


代替案を比較する正直なタイミングについては、より冗長なものを使用してください。

SELECT COUNT(CASE WHEN scoreType = 1 THEN id ELSE NULL END) AS goals, 
     ... 
+0

私が言ったように、目標とアシストは意味的に異なっています。たとえば、得点リーダーは、目標asisst1、assist2によってソート可能です。 scoreTypeを使用してどのようにORDER BY目標を設定しますか?また、クエリーが3行1列ではなく、1行で返されるように見えます。 – virtualeyes

+0

さて、そうでなければ構造化されたソリューションがあまり適していないかどうかは疑問でした。 –

+0

+1はい、LAMPアプリケーションをもっと見るほど、私はそれが深刻なリストラを必要とすると思います;-)スポーツはアイスホッケーです。このように、assist1、assist2(単一のアシスタンスを使用したサッカー/サッカーとは異なり) – virtualeyes