0

有一个我正在转换到 JVM 的旧式 LAMP 应用程序。

有问题的问题需要一个带有@250K 记录的评分表。目前,“scoreType”列表示为 tinyint,其中 1 = 目标,2 = 辅助 1,3 = 辅助 2。

对于得分领先者,要获得每个球员的进球/助攻 1/助攻 2 总数,查询片段如下所示:

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

足够公平,可以完成这项工作,但我想知道,就查询上下文将需要 SUM、COUNT 等操作的一般模式设计而言,最好打破有限的选择集,如目标/辅助 1/辅助 2、赢/loss/tie 等分成单独的列而不是 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 列方法?

感谢您的反馈!

4

1 回答 1

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

不会吗?


对于比较备选方案的诚实时机,请使用更详细的;

SELECT COUNT(CASE WHEN scoreType = 1 THEN id ELSE NULL END) AS goals,
       ...
于 2012-04-26T12:11:10.697 回答