Как правильно синхронизировать продукты с CSV?

Стади кейс, который мне привели на собесе, и который я провалил, т. к. никогда ни с чем подобным не сталкивался.

Есть файл CSV, с несколькими десятками тысяч продуктов, есть Magento 2 с такого же порядка количеством продуктов в базе. Задача - максимально эффективно, не положив сервак (из-за перегрузки по памяти) и не сломав базу, сделать следующее:
1. Обновить атрибуты продуктов, SKU которых уже есть в базе.
2. Добавить продукты, которых еще нет.
3. Удалить продукты из базы Magento, SKU которых нет в CSV.

Вопрос- каковым будет вцелом алогритм работы кода, который будет это делать. (а делать он это будет по крону скорей всего).
Может есть готовые решения (алгоритмы, подходы, паттерны), о которых я не знаю?

На все мои попытки составить алгоритм были возражения либо что пхп съест много памяти, либо что MySQL не обработает такой огромный запрос.
  • Вопрос задан
  • 122 просмотра
Пригласить эксперта
Ответы на вопрос 3
zabudkin
@zabudkin
Инженер-системотехник, программист, админ, ТПУ!!!!
Кто Вам говорил про память - в топку.
1. Всё ручками, точнее запросами.
2. Всё.
Ответ написан
Комментировать
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
blog.nagaychenko.com/2010/04/29/%D0%BA%D0%B0%D0%BA... скорее всего что-то вроде этого хотели
Ответ написан
Комментировать
@dimuska139
Backend developer
1 и 2. Учитывая, что SKU, как я понимаю, уникальное по смыслу значение, на нем висит UNIQUE индекс. Таким образом, можно читать csv-файл построчно и юзать on duplicate key update. Это позволит всего одним циклом обновить атрибуты или добавить недостающие товары в таблицу.

3. Чтобы удалить продукты из базы Magento, SKU которых нет в CSV, надо блоками (по 100 строк, например) читать таблицу товаров в базе и проверять наличие этих SKU в csv-файле. Если не найдено, писать id в массив. После этого сделать удаление всех строк по этим idшникам с момощью sql-оператора IN. Если в массиве набралось очень много id-шников, есть смысл также разделить их на блоки, чтобы в IN не было очень много idшников. Это можно оптимизировать, если на шаге 1 и 2 в пхп-массив писать считанные из файла SKU (даже если там 100к строк, это не сильно много памяти отъест в данном случае) - тогда даже искать в csv-файле не надо будет, достаточно будет проверить просто наличие SKU, взятого из базы, в этом массиве.

P.s. насчет 3. Возможно, было бы еще эффективней в таблицу с товарами добавить столбец, в который на шаге 1 и 2 в том же sql-запросе писать (или переписывать старое значение) текущую дату и время для обработанных записей. После чего всего одним запросом к базе выпилить из таблицы все, что старое (потому что если записано старая дата и время, значит, в csv-файле товара с таким SKU не было, и его можно удалить).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы