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?
  • Вопрос задан
  • 1275 просмотров
Пригласить эксперта
Ответы на вопрос 4
AmdY
@AmdY
PHP и прочие вебштучки
Почитайте об их Eloquent, пропишите связи и тогда работа будет очень простой.
$products = Products::with(['stocks', 'stocks.stock'])->find($id);
$product->name;
$product->stocks; // массив со стоками из stocks
$product->stocks[0]->name; // выведен данные из таблицы stock
Ответ написан
@lega
В ваших таблицах socks.id похоже не нужен вообще, трата памяти и индекс.

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

SELECT products.id, products.name, stock.name, stocks.count
from products
inner join stocks ON stocks.product = product.id
Inner join stocks ON stocks.stock =stock.id
GROUP BY products.id

дальше через where можете фильтровать как вам надо.
Ответ написан
@caballero
Программист
Не надо вообще хранить остатки. Остатки еа любую дату и о́бороты за период легко получить полным пересчетом. Для современного железа не проблема
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы