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?
  • Вопрос задан
  • 1082 просмотра
Пригласить эксперта
Ответы на вопрос 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
Программист
Не надо вообще хранить остатки. Остатки еа любую дату и о́бороты за период легко получить полным пересчетом. Для современного железа не проблема
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
21 сент. 2020, в 16:30
400000 руб./за проект
21 сент. 2020, в 16:15
15000 руб./за проект
21 сент. 2020, в 15:45
60000 руб./за проект