Учебное пособие или помощь в разработке базы данных Advanced Transactional Inventory? - PullRequest
4 голосов
/ 31 марта 2011

Я работаю над системой транзакционной инвентаризации для нашей компании, занимающейся электронной коммерцией, и ищу какое-то руководство или учебное пособие о том, как этого добиться с помощью базы данных MySQL. Есть руководства по программированию и руководства по использованию таких систем, но я не смог найти ресурс с предлагаемыми структурами таблиц или лучшими практиками для реализации ваших собственных.

В этой системе все предметы покупаются, хранятся, перепродаются, а затем отправляются (без производства). Система должна поддерживать несколько «Местоположений» (т. Е. Висконсин, Северная Каролина). Каждое Место может иметь один или несколько «Складов» (здания рядом друг с другом). Каждый склад может иметь один или несколько «островков», при этом каждый остров имеет одну или несколько «полок», а каждая полка имеет одну или несколько «корзин». Товар хранится в корзинах, и у каждого варианта размера / цвета есть своя корзина. Некоторые предметы могут храниться в нескольких корзинах (т. Е. Если мы получим скидку, заказав 2000 за один раз, мы можем положить 10 в низкую корзину, а остальные положить на большую полку в «затоваривании».

Хранить предметы в соответствующих местах довольно просто. Я бы, вероятно, имел бы таблицу Бинов, например:

BinID     BinName            LocationID     WarehouseID    IsleID     ShelfID
---------------------------------------------------------------------------------
1         Widget Bin A          1               1            1           1
2         Widget Bin B          1               2            2           5
3         Large Widget Rack     1               1            5           17
4         Widget Overstock      2               3            6           23

А затем перемещайте предметы между корзинами с помощью таблицы транзакций, например:

TransID   SourceBinID     DestBinID     QTY       Date      Memo
---------------------------------------------------------------------------------
   1          4              1          10     7-22-2011    Moved 10 Widgets...

Но вот где я запутался:

Допустим, сейчас полночь, и клиент заказывает 2 виджета с сайта. В корзине 5 виджетов. Клиент заплатил за свои 2 виджета, поэтому никто другой не может их купить, но сейчас полночь, и никто не работает, поэтому его виджеты все еще сидят в мусорном ведре. Мне нужна какая-то транзакция, которая уменьшает «продаваемое» количество виджетов без уменьшения их количества на полке.

На следующий день сотрудник выбирает эти виджеты и перемещает их в область упаковки. Теперь необходимо выполнить физическую транзакцию, чтобы заметить, что элементы теперь находятся на упаковочной линии и больше не находятся в их корзине. Но упаковка должна быть в особом месте, так как это не то же самое, что обычная корзина, верно? Так что каким-то образом нам нужно переместить вещи из корзины в специальное местоположение, не являющееся корзиной, и нам нужна запись транзакции для этого.

Есть и другие «особые» места, такие как карантин возврата и место для откладывания предметов, когда другие товары для этого заказа находятся в заупорядоченном порядке.

Если вы знаете книгу или онлайн-ресурс, который может объяснить, как это сделать с точки зрения программирования / базы данных, это было бы замечательно. Или, если кто-то уже знает, как это сделать и хотел бы поделиться, это тоже было бы здорово!

Спасибо!

UPDATE:

Я размышлял над этим, и вполне возможно, что «продаваемый» инвентарь (я думаю, он называется «на руках») мог бы быть рассчитан динамически. «Итого по всем лоткам» - «незаполненные заказы» = «на руках». Вопрос в том, будет ли это слишком медленно, чтобы быть практичным? Потребуется выполнить несколько запросов, а затем просмотреть результаты, чтобы получить общую сумму.

Альтернативой может быть отдельная таблица транзакций для «под рукой», но тогда у вас есть два инвентарных журнала - «под рукой» и «физический». Даже при том, что они должны всегда оставаться в синхронизации (если это не ошибка!), Это все еще не правильно?

Я все еще не уверен, что делать с физическими местами. Когда вы отправляете его, он уходит из инвентаря, но для учета в стиле двойной записи он должен куда-то идти. Так что мне понадобится какая-то «ушедшая» корзина. Но неправильно делать «мусор» и «упаковочный стол» «мусорными ведрами», потому что они на самом деле не являются мусорными ведрами.

ОБНОВЛЕНИЕ 3

Изменения:

MoveID     TransID      SourceBinID     DestBinID      Memo
---------------------------------------------------------------------------------
   1          1              4              1          Moved 10 Widgets to bin 1
   2          2              1              4          Received 10 Widgets from bin 4

Проблема:

IssueID     TransID      SourceBinID        Memo
---------------------------------------------------------------------------------
   1          3              4              Shipped Widget to Customer
   2          4              1              Shipped Widget to Customer

Сделки:

TransID          ItemID            Date         QTY     Type  
---------------------------------------------------------------------------------
   1               1             7-22-2011       10     Move     
   2               1             7-22-2011      -10     Move
   3               1             7-23-2011       1      Issue
   4               1             7-24-2011       2      Issue

ОБНОВЛЕНИЕ 4

Хорошо, сейчас я собираюсь сделать еще один удар, без выделений.

Таблица Локаций - «Локация» - это место, где вещи могут «физически» существовать.

       
LocationID  LocationTypeID          LocationName
-------------------------------------------------------------   
1                   1                   A Widget Bin    
2                   1                   A Widget Bin
3                   1                   A Widget Bin
4                   1                   A Widget Bin
5                   5                   Vendor (nowhere)
6                   3                   Packing Table 1
7                   4                   Gone (shipped to customer)

Местоположение имеет «тип». Местоположение может быть корзиной, местоположением затоваривания, упаковочной таблицей или представлять клиента (для исходящих сообщений) или поставщика (для входящих).

Типы месторасположения

   
LocationTypeID  LocationTypeName
-------------------------------------------------------------
1                   Picking Bin
2                   Overstock Bin
3                   Packing/Shipping Table
4                   Shipped Items
5                   Vendor (for reviving)

Физические транзакции - когда все вокруг.

               
TransID   LocationID   Debit      Credit   Memo
-------------------------------------------------------------               
1          5             10                 Initial purchase of 10 Red Widgets
2          1                      10        Initial purchase of 10 Red Widgets
3          1             2                  Pick 2 Widgets AND....
4          3                      2         Move them to the packing table
5          3             2                  Ship Widgets to Customers
6          4                      2         Customer Gets Widgets

1 Ответ

1 голос
/ 01 апреля 2011

Наиболее часто используемый термин - «выделенный». У вас есть 5 виджетов под рукой и 2 были выделены. Это оставляет 3 "в наличии". Когда эти предметы будут выбраны, вам нужно отменить это распределение.

Когда вы удаляете предметы из инвентаря (я называю это «выдачей»), вам необходимо предоставить своего рода «учет затрат», который позволит вам определить, куда ушла эта стоимость.

Еще один совет, который я хотел бы получить, - провести инвентаризацию, используя две транзакции. Удалить количество в одном месте и добавить его в другое. Делая это, вы можете хранить все транзакции, которые влияют на количество на руках, в одной таблице, и это делает определение количества на руках на лету довольно простым.

То, что я делаю, выглядит так:

Inventory Transactions

Это позволяет мне хранить более подробную информацию о конкретном типе транзакции в отдельных таблицах и общие сведения в основной таблице транзакций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...