Управление запасами: Как мне обращаться с проданными инвентарными единицами в базе данных?
Я продаю ликер так что у меня есть инвентарь бутылок. до сих пор у меня есть модель "InventoryUnit", которая ссылается на product и line_item.
должна ли каждая бутылка храниться как отдельный объект InventoryUnit в моей базе данных?
Какова лучшая практика, чтобы уменьшить мой инвентарь? если я продам бутылку, я уничтожу InventoryUnit? или я должен просто добавить столбец статуса, который может быть "продан" или "в наличии"?
я беспокоюсь о производительности, может ли Postgres обрабатывать сотни тысяч объектов InventoryUnit?
Я был бы очень признателен за помощь. извини, я - пользователь интерфейса, так что я действительно отстой в моделировании базы данных...
3 ответа
Один. должна ли каждая бутылка храниться как отдельный объект InventoryUnit в моей базе данных?
Если вы можете продавать их по отдельности, тогда да, отслеживайте их по кейсу / коробке.
Два. Какова лучшая практика, чтобы уменьшить мой инвентарь? если я продам бутылку, я уничтожу InventoryUnit? или я должен просто добавить столбец статуса, который может быть "продан" или "в наличии"?
Используйте понятия Местоположений и Движений (движение должно быть своей собственной сущностью). Например, OpenERP использует "виртуальные местоположения", подобные этому.
Бутылка разбивает? Переместите его из своего инвентарного места в "поврежденное" место
Бутылка пропала? Переместите его из инвентаря в локацию "эфир"
Нашли случайную бутылку? Переместите его из "эфира" в инвентарь
Продал бутылку? Переместите его из инвентаря в "продано"
Купили бутылку? Переместите это от купленного до инвентаря
Три. я беспокоюсь о производительности, может ли Postgres обрабатывать сотни тысяч объектов InventoryUnit?
Postgres может обрабатывать сотни миллиардов объектов. Нормализовать правильно. Используйте небольшие типы данных. Используйте индексы.
Некоторые другие вещи, которые нужно иметь в виду:
- Вы могли бы что-то продать, и это вернули, и вы положили его обратно в инвентарь
- Вы могли бы что-то купить, но это не правильно, поэтому вы отправляете это обратно продавцу
- Вы можете продать то, что вам не принадлежит (на консигнации или еще не в инвентаре)
- В инвентаре может быть что-то, что в данный момент не продается.
Для учета запасов вам также необходимо подсчитать товары по входящим и исходящим перевозкам, за которые вы несете ответственность, исходя из статуса FOB "бесплатно на борту".
Вам нужно подсчитать сырье (сделай сам материал для виноделия?) И работы в процессе, если вы что-то делаете / собираете, а также стоимость заказа и т. Д.
Консигнальные товары не учитываются в бухгалтерском учете.
Вы должны отслеживать инвентарь на самом низком уровне. Другими словами, когда вы собирались выбрать единицу с полки, какую самую конкретную информацию вы должны знать, чтобы получить правильную вещь.
В вашем примере я не мог просто сказать: "Иди, принеси бутылку", или ты можешь принести вино вместо водки. Я также не могу сказать: "Иди, принеси бутылку водки", потому что ты можешь вернуть Абсолют, когда я захочу Ciroc. Наконец, я не могу сказать: "Иди, принеси бутылку Ciroc", потому что ты мог бы вернуть размер 1 л, когда я хотел размер 1,5 л.
Я мог бы сказать: "Идите, возьмите третью бутылку с левой стороны в переднем ряду нижнего корпуса 1,5 л Ciroc", но это было бы глупо, потому что все 1,5 л флаконы Ciroc одинаковы. (Аромат в сторону;)).
Сладкое место становится вашим складом (SKU). К счастью, почти каждая компания в мире уже решила это для вас. Просто используйте номер UPC под штрих-кодом в качестве своего SKU.
Исходя из этого, ваши модели будут что-то вроде...
InventoryOnHand
- id:int
- product_id:int
- quantity:int
Product
- id:int
- sku:string
- name:string
Затем вы будете увеличивать и уменьшать количество InventoryOnHand по мере поступления и отсутствия товара.
Ах, это трудно ответить. Там нет правильного пути, хотя разные модели будут иметь последствия в зависимости от использования.
Если вы отслеживаете малый объем, но очень информативный запас (например, самолеты и запчасти), вы можете определить запись для каждого элемента; если вы моделируете массу идентичных продуктов, практически не имеющих идентичности (как, кажется, ваш случай), я бы сосредоточился на состоянии запасов. Все зависит от того, насколько глубоко вы хотите отслеживать жизненный цикл предмета.
Задайте себе вопрос: "Стоит ли отслеживать этот экземпляр коробки крекеров, или я могу просто отследить, как паллет повлиял на мой текущий запас?" Будет ли заправка создавать запись для каждого литра топлива?