Как правильно обновить записи в таблице MySQL на основе данных из массива?
Приветствую, друзья.
Стоит вопрос об оптимальном алгоритме обновления данных в существующей MySQL таблице товаров из массива. Массив принимается со стороннего ресурса в котором меняется как стоимость, количество, прочие характеристики уже существующего товара, так и могут добавиться новые товары. Количество записей пока около 1000 шт. - немного, но может быть и намного больше со временем.
Как оптимально решить эту задачу с перспективой на увеличение количества записей в таблице?
Перебирать массив и обновлять. Есть метод updateAll, иногда оправдан. Все зависит от ситуации. Не совсем понятно в чем проблема? Вы не знаете как? Или не знаете какой из вариантов выбрать? Если второе, то приведите варианты.
Меня интересует верный и быстрый алгоритм: 1. Загружать данные из таблицы частями (по 1000 записей) с дальнейшей обработкой их в PHP и обновлением записей в таблице. 2. Использовать запрос MySQL UPDATE... (наверное, логичнее разделить запрос на 2 части. Сначала добавить новый записи по несуществующим ID, а потом обновить оставшиеся данные в полученной таблице...)
Первый или второй вариант выбрать? Или иное решение существует?
Марк Дио: Перебирайте записи (foreach), если новая - создавайте если старая проверяйте обновлена ли информация и обновляйте или пропускайте.
Предварительно выберите из базы все записи, id которых есть в перебираемом массиве.
AlikDex: Ну если хотите миновать yii - тогда да. Но учтите, что тогда самому стоит позаботиться о валидации, уязвимостях и т.д. Мне кажется проще использовать in_array или in_array_key.
Максим Тимофеев: ну вообще нет ) Валидировать данные можно динамическим валидтором(DynamicmModel кажись), используя правила нормальной модели, а потом вставить\обновить их. как обычно. Щас кода нет под рукой, но даже дублировать правила не нада, прямо создаем (new MyModel)->rules() в правилах динамической валидации.
AlikDex: А смысл? Можно использовать обычную модель и вызывать $model->validate() и потом сохранять самостоятельно, но метод save() дает защиту от инъекций + не обновляет данные, которые не изменились. Короче, не вижу смысла идти в обход AR. Быстрее если и будет, то на копейки.
Марк Дио: если будет проседать производительность, надо будет не переписывать, а либо менять железо либо оптимизировать. Уход от AR не даст ничего кроме головной боли
если вы не обновляете 1млн элементов, то решайте как-нибудь. вы дольше будете заниматься преждевременной оптимизацией. будет решение, увидите скорость, тогда уже поймёте что оптимизировать.