В чем вы храните корзину от интернет-магазина?

Рейтинг: 1Ответов: 3Опубликовано: 12.04.2015

Добрый день. Взялся я за нетипичный для себя жанр - интернет-магазин. Написал. Все вроде бы как работает. Даже заказ сделать можно. Получилось немного громоздко, но все равно по данным тестов работает быстрее джумлы. И вот, когда у меня все работы практически были закончены. Я понимаю, что использовал сессии весьма не эффективно. При их помощи я только передавал уникальный id пользователя и еще несколько параметров. Для хранения данных из корзины покупок я создал отдельную таблицу и забивал туда данные. Минус данного подхода в том, что практически на каждой странице, появился дополнительный запрос к базе данных.

Расскажите, как вы реализуете корзину товаров в интернет-магазине и что применяете? Сессии, БД, или куки?

Ответы

▲ 3Принят

Рассмотрим по каждому пункту.

Хранение в базе, плюсы:

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

минусы:

  • лишний запрос к базе (но можно использовать memcache)
  • базу нужно подчищать время от времени или писать корректный алгоритм завершения покупки.

Хранение в сессии, плюсы:

  • достаточно быстро.
  • легко очистить.

минусы:

  • сложнее сделать балансировку на несколько серверов
  • тяжелее посмотреть, что там заказал пользователь

куки, плюсы:

  • минимум места для хранения

минусы:

  • невозможно узнать текущее состояние заказа (можно конечно, но если пользователь залогинен и сделает запрос).
  • сложно модифицировать запрос пользователя.
  • нельзя хранить секретную/чувствительную информацию.

Мое предложение - храните все в базе, у пользователя в куках - кол-во купленных товар/результирующая цена (что бы отображать на странице состояние корзины без лишних запросов). При оформлении покупки - обязательно доставайте с базы. В этом случае лишних запросов почти никогда не будет. Если же появится load balancer (балансировщик нагрузки), тогда нужен любой memcache (или что то подобное - redis, mongo), который будет отдавать текущее состояние покупки, с куками будет сложнее.

Также у каждой покупки храните дату/время - это поможет подчищать их в случае необходимости.

▲ 2

Я бы советовал использовать LocalStorage (JS) + БД. Так вы можете всегда хранить данные о заказах на стороне клиента, передавая их на сервис не каждый раз (как в случае с Cookies), а только при непосредственной оплате (оформлении).
Плюсы:
1. Нет затрат на лишний траффик и на нагрузку к БД сервера в виде лишних запросов.
Минусы:
1. Сервер ничего не знает о корзине пользователя, до тех пор пока он не нажмет "Оплатить".
2. Нет синхронизации с другими устройствами (Допустим у пользователя планшет и ПК).

Но минусы вполне решаемы:
1. Знать серверу о корзине и не нужно. Продавец включается в продажу с момента нажатия кнопки: Оформить заказ. Тогда идет запрос к базе и идут проверки наличия товара и пр.
2. Можно выполнять запрос на сервер при добавлении товара (так там создается некий "слепок" или кеш корзины). А на клиент это выгружать только если предыдущий запрос был сделан не с текущего девайса.

Итого имеем:
1. Только один исходящий запрос на добавление в БД на каждый товар.
2. Количество выборок корзины из БД ~ количество устройств пользователя (а не на каждый запрос к сайту).

▲ 2

Я пишу небольшие интернет-магазины, пришел к выводу, что самый просто способ хранить корзинку — в БД. Всегда можно сделать AJAX запрос, пересчитать на стороне сервера. Да есть свои минусы, но чем то приходится жертвовать.