Учебное пособие или помощь в разработке расширенной базы данных инвентаризации транзакций?

Я работаю над системой инвентаризации транзакций для нашей компании электронной коммерции и ищу какое-то руководство или учебник о том, как это сделать с помощью базы данных MySQL. Существуют руководства по программированию и руководства по ИСПОЛЬЗОВАНИЮ таких систем, но мне не удалось найти ресурс с предлагаемыми структурами таблиц или рекомендациями по реализации ваших собственных.

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

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

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 виджета, поэтому никто другой не может их купить, но уже полночь, и никто не работает, поэтому его виджеты все еще лежат в мусорном ведре. Мне нужна какая-то транзакция, которая уменьшает «продаваемое» количество виджетов, не уменьшая их количество на полке.

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

Кроме того, есть другие «специальные» места, такие как возвратный карантин и место для откладывания предметов, когда другие предметы для этого заказа находятся в ожидании.

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

Спасибо!

ОБНОВЛЕНИЕ:

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

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

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

ОБНОВЛЕНИЕ 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

person Nick    schedule 31.03.2011    source источник


Ответы (1)


Чаще всего используется термин «выделено». У вас есть 5 виджетов на руках и 2 выделены. Остается 3 «доступных». Когда эти предметы будут выбраны, вам нужно отменить это распределение.

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

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

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

Операции с запасами

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

person Darrel Miller    schedule 01.04.2011
comment
Итак, у вас есть отдельная таблица распределения? И когда у вас возникает проблема, когда вы выбираете и перемещаете товар (ы) для отправки или когда вы отправляете его и ставите на причал? Я создал одну таблицу выше с двумя транзакциями в ней за ход. Это то, что вы имели в виду? Спасибо! - person Nick; 03.04.2011
comment
Нет, лично я бы сохранил все это в одной таблице с полем дискриминатора типа транзакции. Мой опыт заключается в изготовлении на заказ, поэтому мы выдаем материал на работу, которая потребляет этот материал. Физически это делается в разных точках разными клиентами. - person Darrel Miller; 03.04.2011
comment
См. обновление 3 выше. Что-то такое? Хотя это все еще кажется неправильным. Так идет ли распределение в таблице перемещений? - person Nick; 04.04.2011