Как правильно спроектировать БД прайс-листов ?

Chvalov

Гуру форума
Регистрация
31 Окт 2011
Сообщения
265
Реакции
79
Подскажите как правильнее спроектировать базу для работы с прайс листами:
Сейчас пользуюсь готовым решением (Не своим) который очень костыльный
Все наличия товара сбрасывается в 0, после чего с прайс листов берется количество и обновляются записи
Минусы этого костыля:
  • Это костыль
  • при обновлении 500-600к записей лочит таблицу на долгое время
  • нужно ожидать когда придут все прайсы
  • Количество со всех складов складывается либо в один либо берется только нужный склад ((
Сейчас набросал вот такую схему:


PHP:
-- Таблица с продуктами
CREATE TABLE product (
  id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  image VARCHAR(128) NULL DEFAULT NULL, -- Todo отдельная таблица для доп картинок
  price DECIMAL(13,6) NOT NULL COMMENT 'Цена товара',
  brand INT(10) UNSIGNED NOT NULL,
  SKU VARCHAR(64) NOT NULL COMMENT 'Артикул товара',
  PRIMARY KEY (`id`),
  INDEX product_brand_idx (SKU,brand),
  CONSTRAINT FK_product_brand_id FOREIGN KEY (`brand`) REFERENCES brands(`id`)
) ENGINE=InnoDB;
Так-же будет еще таблица supplier__config, для задавания настроек в какой кодировке, с какого рядка, и где нужные данные в каком столбце....

После заливки прайс листа, будет идти перекалькуляция, буду брать количество и цену с supplier__product и писать в таблицу products

Правильно ли я все делаю ?
Товары с главной таблицы products связывать по SKU (supplier__product) ?
Также придется проходится и искать товары которых нету в products, но появились у поставщиков, добавлять товар привязывать к категории...

Буду рад любой помощи !
 

Black Hat

Постоялец
Регистрация
15 Май 2015
Сообщения
167
Реакции
111
Все наличия товара сбрасывается в 0, после чего с прайс листов берется количество и обновляются записи
  • при обновлении 500-600к записей лочит таблицу на долгое время
  • нужно ожидать когда придут все прайсы
1. Оборачиваем все в транзакцию. Если не меняли уровень изоляции, все таблицы будут в это время доступны для чтения, причем там будут старые значения, вплоть до COMMIT.
2. Добавляем колонку "дата обновления", DATETIME. Потом делаем так:
- запоминаем текущую дату, например 2018-02-18 18:26:00
- добавляем/обновляем данные из прайса, ставя дату обновления "2018-02-18 18:26:00"
- по завершении делает UPDATE ... WHERE `dateUpdate` <> "2018-02-18 18:26:00"

warehouse VARCHAR(255) NOT NULL COMMENT 'Склад (Адрес)', -- Походу сделать еще таблицу складов, а тут писать их id ??
count INT(10) UNSIGNED NOT NULL COMMENT 'Количество', -- Todo как-то переделать, складов много наличие на разных складах разное !!
Смотря для чего нужно. Если хотите выбирать по этим остаткам, да, нужны таблицы. Не хотите - сделайте сериализацию или JSON, а запихните все в один столбец. И если у вас не слишком допотопный мускул, он и по Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
Сверху