Задавайте вопросы, мы ответим
Вы не зашли.
Приветик всем!
Предыстория:
Жил был маленький магазинчик, и было легко помогать его строить. И тут случилась продажа 50%, и второй владелец, который хочет все поменять, что и не странно, потенциал есть. Количество товаров сильно увеличилось, как и количество поставщиков, и свалилось все на мои хрупкие плечики.
Подскажите, столкнулась с такой проблемой. Логика строилась давно, а знаний сильно не добавилось, скорее всего вина во всем моя( хнык.
Сейчас около 10тыс товаров, и есть иерархия поставщиков, у каждого свой приоритет от 1 до 3. Цены и позиции у поставщиков могут быть одинаковыми.
Приоритет 1 - все товары поставщика, даже если стоимость выше минимальной цены, должны отображаться в 1 очередь.
Приоритет 2 - проверенные поставщики, отображаются в остальных товарах, по минимальной цене.
Приоритет 3 - непроверенные поставщики, ими нужно заполнить товары, незаполненные поставщиками 1 и 2 приоритета.
Цены считываются в промежуточную базу, откуда я выгружаю (пока только планирую) их в основную, стараюсь все максимально делать через mysql.
Нужно быстро и незаметно для покупателей производить обновление цен в магазине. Сейчас обновление парализует магазин на 5 мин.
Структуры таблиц
products
id int
product_name varchar
product_vendor varchar
price decimal
priority smallint
Индексы
int
product_name
до чего сама смогла додуматься:
- создать новую таблицу
CREATE TABLE products_update LIKE products
- туда данные с минимальными ценами
SELECT DISTINCT product_name, product_vendor, min(price) AS price FROM products GROUP BY product_name;
- запросом с подзапросом обновить цены основываясь на приоритете
пытаюсь выбрать самые низкие цены и высший приоритет
UPDATE products_update t
SET t.price = (
SELECT min(p.price) FROM products p WHERE t.name = p.name AND t.priority > p.priority)
WHERE t.priority > 1;
Отредактированно Катерина89 (12.01.2016 18:16:46)
Неактивен
Если честно, не очень понял, какую проблему Вы пытаетесь решить — медленное обновление или написать запросы, которые реализуют бизнес-логику?
Если первое, то проще всего действительно заполнять новую табличку, а потом делать одновременное переименование таблиц: RENAME products TO products_old, products_new TO products. Тогда Вы подкладываете просто новый слепок данных, и пользователи ничего не замечают.
Если второе, то я бы просто последовательно заполнял таблицу для трех видов приоритетов (высший к низшему), при этом не перезаписывая данные (INSERT IGNORE).
Неактивен