Есть один сайт с новостями, который я сопровождаю на работе. На том сайте есть функция "Показать последние комментарии". Когда-то не очень давно и не очень близко мне было поручено добавить к каждому комментарию ссылочку "Перейти", при нажатии на которую пользователь должен переходить на страницу с новостью аккурат к нужному комментарию. Задача, в общем-то тривиальная - на странице с новостью каждому комментарию назначается якорь, а в ссылке "Перейти" указывается переход по этому якорю. На выполнение этой работы у меня ушло 2 минуты. И как всегда, русская народная пословица "Поспешишь - людей насмешишь" оказалась дюже актуальной.
Ничто не предвещало беды, пока в один недобрый день не появилась новость, к которой было оставлено комментариев на 5 страниц. Само по себе это было не фатально, но ссылочка "Перейти" работать перестала. Всё дело в том, что в этой ссылочке не указан номер страницы, на которой находится комментарий. Осложняется ситуация ещё и тем, что благодаря сортировке по дате комментария номер страницы, грубо говоря, не является константой и один и тот же комментарий с течением времени может переместиться с 1-й страницы на 10-ю.
Решение было найдено сравнительно быстро - комментариям был добавлен признак "порядковый номер комментария в новости". Реализация (в силу моей страсти к извращениям и сравнительно большого массива данных) затянулась на 4 часа. Сперва я написал хранимую процедуру для базы данных, которая для каждой отдельной новости пересчитывала порядковые номера комментариев. В тестовом окружении она работала сравнительно быстро (0.3-0.5 сек), а в продакшне тормозила (от 10 до 200 сек). Позже я попробовал ещё пару вариантов, но в итоге остановился на приемлимом - SQL-запросами пересчитываю порядковые номера (при добавлении MAX()+1, при удалении n-1 WHERE n>m). Теперь всё работает быстро.
Моралей у этой басни несколько:
1. Господа заказчики, начальники и прочие "вышестоящие", я не ругаюсь и не жалуюсь, но никогда не говорите "эта задача простая и много времени не займёт"
2. Господа разработчики, нефиг выёживаться, простота - залог успеха!
3. Прочие - учите пословицы, полезно и познавательно :)
PS: Не забыть бы ночью запустить скрипт, который пересчитает все порядковые номера...
четверг, 6 августа 2009 г.
Подписаться на:
Сообщения (Atom)
