有一个传统的LAMP应用程序,我正在转换到JVM。
有问题需要一张带有250K记录的评分表。目前,“scoreType”列表示为tinyint,其中1 = goal,2 = assist1,3 = assist2。
对于得分领先者,要获得每个玩家的goal / assist1 / assist2总计,查询代码段如下:
SUM(IF(scoreType=1,1,0)) AS goals, SUM(IF(scoreType=2,1,IF(scoreType=3,1,0))) AS assists
足够公平,完成工作,但我想知道,在一般架构设计方面,查询上下文将需要SUM,COUNT等操作,最好是突破有限的选择设置如目标/辅助1 /辅助2,赢/输/领带等分为单独的列而不是tinyint方法?
在单独的列中,查询变为:
SUM(goal) AS goal, SUM(assist1) AS assist1, SUM(assist2) AS assist2
性能获胜(不需要if(cond,a,b)匹配),但存储量略有增加(3列对1)。
在应用程序层,一个潜在的大胜利是从ORM不支持的SUM(if())转移到column.Sum();否则,我需要使用一对一的方法保持非静态类型的字符串SQL查询
思考?您将如何解决,保持原样,或将数据库和应用程序代码迁移到3列方法?
感谢您的反馈!
答案 0 :(得分:1)
SELECT scoreType, COUNT(scoreType)
FROM ...
GROUP BY scoreType
不是吗?
为了比较替代方案的诚实时间,请使用更详细的;
SELECT COUNT(CASE WHEN scoreType = 1 THEN id ELSE NULL END) AS goals,
...