Задать вопрос
VictoRD11
@VictoRD11

Как правильно хранить остатки товаров, когда n складов?

Всем привет!
Нужно помочь з правильным хранениям остатки товаров, когда есть n складов.

Сейчас есть 3 таблицы, хранения товаров (≈ 300 000), храненния остатков (≈ 1 000 000), склады(5):
CREATE TABLE `products` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=224583 DEFAULT CHARSET=utf8;

CREATE TABLE `stocks` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `stock` int(11) DEFAULT NULL,
  `product` int(11) DEFAULT NULL,
  `count` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `cid` (`product`)
) ENGINE=InnoDB AUTO_INCREMENT=536813420 DEFAULT CHARSET=utf8;

CREATE TABLE `stock` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(512) CHARACTER SET cp1251 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;


Чтоб получить список товаров и их остатки, составил вот такой запрос:
SELECT products.id, products.name, GROUP_CONCAT(CONCAT_WS("|", stocks.stock, stocks.count) SEPARATOR ",") AS counts FROM products LEFT JOIN stocks ON products.id = stocks.product GROUP BY products.id LIMIT 0, 10

Результат запроса:
bb1b7e0c3d4c473c969207d63c9e1762.png

После получения данных склады (counts) разделяю на PHP функцией explode

Теперь вопросы:
1. Есть ли лучшие решения хранить остатки?
2. Как правельно фильтровать? (Например если я хочу по двум складам только учитывать наявные товары)
3. Как можно получить остатки без explode?
  • Вопрос задан
  • 1285 просмотров
Подписаться 2 Оценить 6 комментариев
Ответ пользователя lega К ответам на вопрос (4)
@lega
В ваших таблицах socks.id похоже не нужен вообще, трата памяти и индекс.

Это похоже на кеш (второстепенную) таблицу, тогда можно вообще одной таблицей обойтись (или двумя), в каждом продукте хранить список складов с остатками.
Сэкономите на индексах и работать будет быстрее (без джойнов в БД).
Если нужна будет фильтрация по складу тогда можно будет наложить индекс массив складов (если mysql уже это поддерживает).
Ответ написан