私は電子商取引会社のトランザクション在庫システムに取り組んでおり、MySQL データベースでこれを達成する方法についての何らかのガイドまたはチュートリアルを探しています。プログラミング方法に関するガイドと、そのようなシステムの使用方法に関するガイドがありますが、提案されたテーブル構造や独自の実装のベスト プラクティスを含むリソースを見つけることができませんでした。
このシステムでは、すべてのアイテムが購入され、保管され、転売され、出荷されます (製造は行われません)。システムは、複数の「ロケーション」(ウィスコンシン、ノースカロライナなど)をサポートする必要があります。各場所には、1 つまたは複数の「倉庫」(隣り合った建物) を配置できます。各倉庫には 1 つ以上の「アイル」があり、各アイルには 1 つ以上の「棚」があり、各棚には 1 つ以上の「ビン」があります。商品はビンに保管され、各サイズ/カラー バリエーションには独自のビンがあります。一部のアイテムは複数のビンに保管される場合があります (つまり、一度に 2000 個を注文して割引を受ける場合、10 個を低いビンに保管し、残りを「過剰在庫」の高い棚に置く場合があります。
アイテムをそれぞれの場所に保管するのは簡単です。おそらく次のような Bins テーブルがあります。
BinID BinName LocationID WarehouseID IsleID ShelfID -------------------------------------------------- ------------------------------- 1 ウィジェット ビン A 1 1 1 1 2 ウィジェットビン B 1 2 2 5 3 ラージ ウィジェット ラック 1 1 5 17 4 ウィジェットの過剰在庫 2 3 6 23
次に、次のような在庫トランザクション テーブルを使用してビン間でアイテムを移動します。
TransID SourceBinID DestBinID QTY 日付 メモ -------------------------------------------------- ------------------------------- 1 4 1 10 2011 年 7 月 22 日 10 個のウィジェットを移動しました...
しかし、ここで私は混乱します:
真夜中に顧客が Web サイトから 2 つのウィジェットを注文したとします。ビンには 5 つのウィジェットがあります。顧客は 2 つのウィジェットの代金を支払ったため、他の誰もそれらを購入することはできません。実際に棚にある数を減らすことなく、「販売可能な」ウィジェットの数を減らす何らかのトランザクションが必要です。
翌日、従業員がそれらのウィジェットを選び、梱包エリアに移動します。ここで、アイテムが現在梱包ラインにあり、もはやビンに入っていないことに注意するために、物理的な取引を行う必要があります。しかし、梱包は通常の「ビン」と同じではないため、特別な場所である必要がありますよね? したがって、どうにかしてビンからビン以外の特別な場所に物を移動する必要があり、それを行うためのトランザクション エントリが必要です。
次に、返品検疫のような他の「特別な」場所と、その注文の他のアイテムが取り寄せになっているときにアイテムを取っておく場所があります.
プログラミング/データベースの観点からこれを行う方法を説明できる本またはオンライン リソースを知っていれば、それは素晴らしいことです。または、誰かがすでにこれを行う方法を知っていて、喜んで共有してくれるなら、それも素晴らしいことです!
ありがとう!
アップデート:
これについてもう少し考えてみたところ、「販売可能な」在庫 (「手持ち」と呼ばれていると思います) を動的に計算できる可能性があります。「すべてのビンの合計」 - 「満たされていない注文」 = 「手持」。問題は、遅すぎて実用的ではないということです。いくつかのクエリを実行し、結果をループして手持の合計を取得する必要があります。
別の方法として、「手持」用に別のトランザクション テーブルを用意することもできますが、その場合、「手持」と「現物」の 2 つの在庫仕訳帳があります。それらは常に同期している必要がありますが (そうでない場合はバグです!)、それでもうまくいきませんか?
物理的な場所をどうするかはまだわかりません。出荷すると在庫からなくなりますが、複式簿記の場合はどこかに行く必要があります。したがって、ある種の「なくなった」ビンが必要になります。しかし、"gone" や "packing table" を "bins" にするのも適切ではありません。これらは実際にはビンではないからです。
更新 3
動き:
MoveID TransID SourceBinID DestBinID メモ -------------------------------------------------- ------------------------------- 1 1 4 1 10 個のウィジェットをビン 1 に移動しました 2 2 1 4 ビン 4 から 10 個のウィジェットを受信
問題:
IssueID TransID SourceBinID メモ -------------------------------------------------- ------------------------------- 1 3 4 ウィジェットを顧客に発送 2 4 1 ウィジェットを顧客に出荷
取引:
TransID ItemID 日付 数量 タイプ -------------------------------------------------- ------------------------------- 1 1 2011 年 7 月 22 日 10 移動 2 1 2011 年 7 月 22 日 -10 移動 3 1 2011 年 7 月 23 日 1 号 4 1 2011 年 7 月 24 日 2 号
更新 4
わかりました、今のところ割り当てなしで、これをもう一度試してみます。
場所テーブル - 「場所」とは、物が物理的に「ある」場所です。
LocationID LocationTypeID LocationName -------------------------------------------------- ----------- 1 1 ウィジェットビン 2 1 ウィジェットビン 3 1 ウィジェットビン 4 1 ウィジェットビン 5 5 ベンダー (どこにもいない) 6 3 梱包表1 7 4 なくなった (顧客に出荷された)
場所には「タイプ」があります。ロケーションは、ビン、過剰在庫ロケーション、梱包テーブル、または顧客 (アウトバウンドの場合) またはベンダー (インバウンドの場合) を表すことができます。
場所の種類
LocationTypeID LocationTypeName -------------------------------------------------- ----------- 1 ピッキングビン 2 在庫過剰ビン 3 梱包・発送表 4 発送済み商品 5 ベンダー(復活用)
物理的な取引 - 物事が動き回るとき。
TransID LocationID デビット クレジット メモ -------------------------------------------------- ----------- 1 5 10 レッドウィジェット10個の初回購入 2 1 10 赤ウィジェット10個の初回購入 3 1 2 2 つのウィジェットを選択し、かつ.... 4 3 2 梱包テーブルに移動します 5 3 2 ウィジェットを顧客に発送する 6 4 2 顧客がウィジェットを取得