有一个我正在转换到 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 列方法?
感谢您的反馈!