2. О себе
●
Капля Антон
●
Сотрудник консалтингового отдела (aka ECg)
●
Работаю в Мадженто более трех лет
●
Был замечен в таких проектах как
●
Ford (Мадженто которая работает с SQL Server)
●
Регулярных релизах (1.11-1.13)
●
И прочем непотребстве….
3. О презентации
●
Новые фичи в Мадженто
●
Aгрегация и денормализация
●
Оценим новые индексаторы
●
Сварганим пару простых примеров
4. Чего нового в Мадженто 1.13
●
Расширенная библиотека для работы с базой данных
●
Материализация запросов
●
Индексаторы
6. Пример: создание триггера
PHP
/**@var $connection Varien_Db_Adapter_Interface */
$sqlTrigger = new Magento_Db_Sql_Trigger();
$sqlTrigger->setTarget('tag')
->setEvent(Magento_Db_Sql_Trigger::SQL_EVENT_INSERT)
->setName('trg_tag_before_insert')
->setBody('INSERT INTO new_tag (tag_id) VALUES (NEW.tag_id);');
$connection->query((string)$sqlTrigger);
SQL
CREATE TRIGGER trg_tag_before_insert
AFTER INSERT
ON tag FOR EACH ROW
BEGIN
INSERT INTO new_tag (tag_id) VALUES (NEW.tag_id);
END;
7. Материализованное представление
●
Материализированое представление — объект базы
данных содержащий результат выполнения запроса.
●
Основная задача — организация сложно согласованных
данных для для быстрого доступа к ним.
●
Доступ к данным материализированого представления
может быть оптимизирован посредством индексов.
14. Пример: Количество продуктов
Закешируем запрос с количеством продуктов
/** @var $select Varien_Db_Select */
$select
->from(array('cpe' => 'catalog_product_entity'), array())
->joinLeft(array('csi' => 'cataloginventory_stock_item'),
'csi.product_id = cpe.entity_id', array())
->columns(array(
'entity_id' => 'cpe.entity_id',
'sku' => 'cpe.sku',
'qty' => new Zend_Db_Expr('IFNULL(csi.qty, 0)')
));
/** @var $client Enterprise_Mview_Model_Client */
$client = Mage::getModel('enterprise_mview/client');
$client->init('product_qty')
->execute('enterprise_mview/action_mview_create', array(
'select' => $select
));
15. Пример: Количество продуктов
По умолчанию нам доступна команда обновления всех данных
$client->init('product_qty');
->execute('enterprise_mview/action_mview_refresh');
По умолчанию нам доступна команда обновления всех данных
Для обновления по ключу нам необходимо задать ключ
$client->getMetadata()
->setKeyColumn('entity_id')
->save();
$client->execute('enterprise_mview/action_mview_refresh_row', array(
'value' => 16
));
16. Обновление только изменных данных
●
Логирование изменяемых данных.
●
Мадженто использует триггеры баз данных
17. Пример: Активация лога изменений
Подготовим таблицу которая будет накапливать изменения:
Активируем лог указав интересующую нас таблицу и колонку
$client = Mage::getModel('enterprise_mview/client');
$client->init('product_qty')
->execute('enterprise_mview/action_changelog_create');
$client->init('product_qty')
->execute('enterprise_mview/action_changelog_subscription_create',
array(
'target_table' => 'catalog_product_entity',
'target_column' => 'entity_id',
));