Вставка/апдейт записей в цикле

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
pioneer
Сообщения: 136
Зарегистрирован: 2013.03.10, 23:27

Вставка/апдейт записей в цикле

Сообщение pioneer »

Здравствуйте, уважаемые форумчане!
В разрабатываемом проекте имеется функционал импорта товаров из XML файла (в целях оптимизации быстродействия используется связка XMLReader + SimpleXMLElement), раннее логика процесса была такова: спарсить товары из XML'ки в массив, пройтись по этому массиву разделив его на 2 - товары которые нужно проапдейтить и новые товары которые нужно вставить. Опять-таки, в целях быстродействия скрипта данные записи вставлялись/апдейтились пачками, вот так:

Код: Выделить всё

// $productsToInsert - массив с записями которые нужно добавить в БД
if (!empty($productsToInsert)) {
    $multipleInsertCommand = Yii::app()->db->schema->commandBuilder->createMultipleInsertCommand(self::TABLE_PRODUCTS, $productsToInsert);
    $newProducts = $multipleInsertCommand->execute();
}

// $productsToUpdate - массив с записями которые нужно обновить в БД
if (!empty($productsToUpdate)) {
    $query = "UPDATE ".self::TABLE_PRODUCTS." SET `price`=:price, `name`=:name, ... WHERE `id`=:id";
    $command = Yii::app()->db->createCommand($query);
    $command->bindParam(":price", $price, PDO::PARAM_STR);
    $command->bindParam(":name", $name, PDO::PARAM_STR);
    //...
    $command->bindParam(":id", $id, PDO::PARAM_STR);

    $transaction = Yii::app()->db->beginTransaction();

    foreach ($productsToUpdate as $product) {
        $price = $product['price'];
        $name = $product['name'];
        // ...
        $id = $product['id'];
        if ($command->execute())
            $updatedProducts++;
        }

        $transaction->commit();
}
Т.е. для быстрой вставки нескольких записей было решено использовать имеющуюся в Yii команду createMultipleInsertCommand, а для массового обновления - транзакцию приведенную выше, и все это вместе действительно работало достаточно быстро и эффективно.

Однако появились новые требования: в ходе импорта товаров помимо обновления информации в одноименной таблице также необходимо выполнять привязку товаров к категориям - т.е. писать информацию ещё и в связную таблицу (связную - потому что один товар может быть привязан сразу к нескольким категориям, оттого полем `category_id` в таблице товаров не обойтись) - стало быть, имеющейся логикой воспользоваться больше не удастся - нужен циклический проход с получением идентификаторов добавляемых/обновляемых записей с сопутствующей привязкой к категориям. Пока решил использовать AR, но ведь это существенно ударит по ресурсам...Что подскажете из позиций оптимизации быстродействия?
Ответить