В прошлой заметке мы рассмотрели теоретический пример, а теперь перейдем к практическому. У меня на сайте клиента есть система подсчета профиля, чтобы узнать, что больше любит посетитель. Например, на ozon это может выглядеть как - просмотрел страничку с книжкой, получи один поинт в пользу книголюба. Просмотрел косметику, получи один поинт в пользу гламурного падонка.
Получив немного статистики, можно понять, что больше любит посетитель сайта и предлагать ему более релевантную рекламу и более полезные советы, что сделает сайт более удобным для покупателя.
Но разные действия стоят разных поинтов. Например, если я просто посмотрел товар на сайте, то можно дать 1 поинт, а если я его положил в карзину, то 5, а если еще и купил, то 10.
Для своей реализации я не стал хардкодить ничего, потому что ненавижу хардкодить, а создал табличку ProfileAction, в которой для каждого действия есть строка и для в строке указано, сколько поинтов должен получить пользователь. Потом написал небольшой класс, который все это реализует в действия.
Но при каждом просмотре странице каталога заглядывать в таблицу ProfileAction для того, чтобы посмотреть, сколько поинтов дать в пользу профиля - самоубийство, точнее убийство базы данных. Так как действия не изменяются часто (в моем случае за год менялась только одна строчка пол года назад) вполне реально рассмотреть данные как статичные.
Создаем статичные переменные для основных действий (их же немного, у меня их всего 7, хотя я вам показал только три и я решил объявить их явно):
public static ProfileAction ProductView; public static ProfileAction AddWishList; public static ProfileAction AddToCart;
Если бы было бы больше, то я бы создал Hash таблицу, статичную ключом в которой был бы ключ действия. Но это уже так, лирическое отступление.
class MemberProfileAction { public static ProfileAction ProductView; public static ProfileAction AddWishList; public static ProfileAction AddToCart; static MemberProfileAction() { ProductView = LoadProfileAction("PV"); AddWishList = LoadProfileAction("ADDWL"); AddToCart = LoadProfileAction("ADDCART"); } // Дальше идут методы в которых я раздаю поинты и т.д.
}
LoadProfileAction - это статиичная функция, которая загружает нужный класс по аббревиатуре, которую я передаю в качестве параметра.
Один раз при первом обращении загружаются все параметры действий и после этого база данных вообще не тревожится по таким мелочам.
Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым
Вместо того, что бы делать 2 запроса (считать запись с ProfileAction, а потом изменить количество поинтов), делается один запрос (на апдейт поинтов). Такая оптимизация не особо поможет в этом случае.
Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.