Как организовать хранение гостевых данных в интернет-магазине?

Ссылка скопирована
1 ответ

Есть интернет-магазин на Laravel, для зарегистрированных пользователей хранение избранных товаров, корзины, просмотренных товаров происходит в PosgreSQL, необходимо такую же логику перенести на гостевых пользователей, но так как у гостя нет никаких данных в бд, кроме session_id или токена, который я ему генерирую и сохраняю в куки), возникла потребность в реализации хранения гостевых данных в key-value базе данных. Сначала выбор пал на Redis, но так как одна из особенностей хранения гостевых данных заключается в том, что эти данные нужно хранить пару месяцев (может больше), то есть гость (при сохраненном токене в куки), должен теоретически иметь возможность посмотреть свою корзину или избранное и через месяц-два, пришло понимание, что Redis для этих целей не особо подходит, так как данные хранятся в оперативной памяти.

Для key-value хранения на SSD есть MongoDB, которую сейчас рассматриваю как доп базу данных к основной на PostgreSQL, используемую для гостевых данных, но никогда подобную историю не реализовывал. Отсюда основной вопрос:
правильны ли мои мысли по поводу MongoDB в качестве дополнительной базы данных или нужно использовать что-то другое? Или просто сделать отдельную таблицу в посгресе типа guest_cart, guest_favorites (но тут уже могут быть нюансы при автоудалении большого кол-ва просроченных (неактульных) записей)?

Дополнительно:

1. Redis умеет в persistence и позволяет сбрасывать данные на диске и хранить их там. Было бы желание
2. Postgres умеет в json и создать там таблицу session_id, content json не вопрос. И если у вас HDD + SSD через tablespaces конкретно ее можно вынести на SSD.

Вы как то много написали что вы хотите выбрать из БД, как хранить - но очень мало описали что именно вы собираетесь хранить и как часто хотите это выбирать - а это основной вопрос

Ответы:

А почему по простому не решаете? (допустим, если у вас не высокие нагрузки на базу).

Записываете уник сессию гостя в базу (это дает еще много прикольных штук).
Записываете в таблицы, типа guest_cart, guest_favorites и любые другие таблицы.
По необходимости мигрируете из этих таблиц данные в основную запись пользователя, если он зарегистрируется.
Записываете last_action_ts в сессию бд. И стираете раз в день данные, если last_action_ts уже старше чем 2 месяца.

  • Это один из вариантов, если использовать postgres, да. Такой подход в целом жизнеспособен, смущает лишь то, что на каждый новый тип данных (если что-то новое надо будет хранить кроме корзины, избранного и просмотренного), придется делать новую таблицу, хотелось сразу это вынести в отдельную базу.
  • Алексей Скляров,
    а зачем?

    ну, по сути, вы можете записать пользователей сессии к пользователям с меткой -1 (минус ID), или добавить маркеры, что это пользователи сессии.
    И вести их уже как настоящих временных пользователей. со всеми функциями , что у вас будут.

    Даже имя им дать, например как в гугл таблицах - Неопознанный зеленый лев)

На клиенте в куках/localstorage и хранить. БД тут совсем не нужна.

  • Проблема в том, что нужна возможность работы с этими сохраненными гостевыми данными. В вашем примере данные хранятся только на клиенте.
  • Хранение на сервере данных - еще может давать крутой плюс в виде прогрева клиента.

    Простой пример - вы статистикой замечаете, что пользователь смотрит один и тот же товар уже 5 дней из 7.
    Ну так дайте ему скидку в 5-10%, и этот лид ваш вместе с регистрацией и другой механикой прогрева.

  • Алексей Скляров а, ну тогда да, сохраняйте в либо основную либо в дополнительную БД. Redis на самом деле тоже вполне можно использовать - только запускать его отдельным инстансом в облаке и не трогать лишний раз. Он спокойно месяцами и более может работать.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Никита Орлов Ответ

Для организации хранения гостевых данных в интернет-магазине можно использовать несколько подходов в зависимости от конкретных требований и возможностей вашего проекта. Вот несколько способов, которые можно применить:

1. Cookies: Один из самых простых способов хранения гостевых данных - использование cookies. Cookies - это небольшие файлы, которые хранятся на компьютере пользователя и позволяют сохранять информацию о его действиях на сайте. Например, в cookies можно хранить идентификатор корзины покупок или предпочтения пользователя.

```php

// Установка cookie
setcookie("cart_id", $cart_id, time() + 3600, "/");
 
// Получение значения cookie
$cart_id = $_COOKIE["cart_id"];

// Установка cookie setcookie("cart_id", $cart_id, time() + 3600, "/"); // Получение значения cookie $cart_id = $_COOKIE["cart_id"];

```

2. Сессии: Другой способ - использование сессий. Сессии позволяют хранить данные на сервере и связывать их с конкретным пользователем посредством уникального идентификатора сессии. Сессии удобны, когда требуется хранить больше информации, чем позволяют cookies.

```php

// Начало сессии
session_start();
 
// Сохранение данных в сессии
$_SESSION["user_id"] = $user_id;
 
// Получение данных из сессии
$user_id = $_SESSION["user_id"];

// Начало сессии session_start(); // Сохранение данных в сессии $_SESSION["user_id"] = $user_id; // Получение данных из сессии $user_id = $_SESSION["user_id"];

```

3. База данных: Если требуется хранить большой объем данных о гостевых пользователях, то лучше всего использовать базу данных. В базе данных можно хранить информацию о корзинах покупок, предпочтениях пользователей и другие данные.

```php

// Подключение к базе данных
$connection = new mysqli($host, $user, $password, $database);
 
// Сохранение данных в базе данных
$query = "INSERT INTO guest_data (cart_id, user_id) VALUES ('$cart_id', '$user_id')";
$connection->query($query);
 
// Получение данных из базы данных
$query = "SELECT * FROM guest_data WHERE user_id = '$user_id'";
$result = $connection->query($query);

// Подключение к базе данных $connection = new mysqli($host, $user, $password, $database); // Сохранение данных в базе данных $query = "INSERT INTO guest_data (cart_id, user_id) VALUES ('$cart_id', '$user_id')"; $connection->query($query); // Получение данных из базы данных $query = "SELECT * FROM guest_data WHERE user_id = '$user_id'"; $result = $connection->query($query);

```

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

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно