MySQL :: Когда следует перенести функции SQL (условия, форматирование) на уровень промежуточного программного обеспечения? - PullRequest
0 голосов
/ 25 мая 2011

На протяжении многих лет я привык (не совсем уверен, хорошо это или плохо, отчасти причина вопроса) использовать условные выражения для форматирования или групповые функции, а также функции даты для форматирования даты.

Примеры:

// Grouping: get total goals & assists for each player (1 = goal, 2,3 = assist)
SUM(IF(scoreType=1,1,0)) AS goals, SUM(IF(scoreType=2,1,IF(scoreType=3,1,0))) AS assists

// Date formatting:
DATE_FORMAT(gameDate, '%b %e') AS displayDate

// Text formatting:
IF(gameType='S','(S)','') AS gameTypeDisplay

Хорошо бы продолжить, как есть, но я перехожу к системе на основе ORM, где "select *" является значением по умолчанию, а замена поля (для достижения вышеизложенного), хотя и возможна, просто вносит полный беспорядок вещи, когда у вас есть несколько условий для обработки в вашем запросе (в основном лучше иметь чистый, читаемый SQL или ORM DSL, но не смешивать их, imo).

Итак, каковы затраты на перемещение, скажем, условного форматирования текста выше уровня промежуточного программного обеспечения? например 1000 строк результатов запроса; цикл, и применять условно для каждой строки?

По сути, я бы хотел очистить код слоя промежуточного программного обеспечения / ORM и разгрузить функции удобства SQL, но только если я не собираюсь перетаскивать сервер на медленную работу, поскольку уровень промежуточного программного обеспечения выполняет тонны дополнительной обработки.

Настройка сервера - это 32-разрядная версия CentOS 5, JVM (промежуточное программное обеспечение Groovy) с MySQL 5 и более поздних версий.

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Вы можете использовать представление.

create or replace view fancy_table AS 
   SELECT DATE_FORMAT(gameDate, '%b %e') AS gameDate,
        IF(gameType='S','(S)','') AS gameType, other, cols, here FROM table;

тогда ваш orm может использовать * на просмотре.

select * from fancy_table;
1 голос
/ 25 мая 2011

Не знаю, какая у вас структура данных, но я предполагаю:

// Grouping: get total goals & assists for each player (1 = goal, 2,3 = assist)
SUM(IF(scoreType=1,1,0)) AS goals, SUM(IF(scoreType=2,1,IF(scoreType=3,1,0))) AS assists

В любом случае это невозможно сделать эффективно на уровне приложения, поэтому вы захотите сохранить его в SQL.

// Date formatting:
DATE_FORMAT(gameDate, '%b %e') AS displayDate

// Text formatting:
IF(gameType='S','(S)','') AS gameTypeDisplay

И то, и другое может быть эффективно сделано в приложении.На самом деле, должно , поскольку это будет означать меньше работы для вашей базы данных.

...