質問

これは、「プログラミング」に関する質問ではありません。 (どの言語やデータベースにも固有ではありません)が、より多くの設計とアーキテクチャです。また、「Xを実行する最善の方法」というタイプの問題でもあります。私は多くの「宗教」に何の原因もないことを願っています。論争。

過去に、何らかの形でアイテムの在庫を保持するシステムを開発しました(関連するアイテムはありません)。トランザクションをサポートしない言語/ DBを使用しているものもあります。そのような場合、アイテムレコードのフィールドにアイテムを手持ちの数量として保存しないことを選択しました。代わりに、手持数量は、受け取った在庫の合計-販売した在庫の合計を計算します。これにより、ソフトウェアによる在庫の差異はほとんどありません。テーブルは適切にインデックス付けされ、パフォーマンスは良好です。レコードの量がパフォーマンスに影響を与える場合に備えて、アーカイブプロセスがあります。

今、数年前にこの会社で働き始め、在庫を追跡するシステムを継承しました。ただし、数量はフィールドに保存されます。エントリが登録されると、受け取った数量がアイテムの数量フィールドに追加されます。アイテムが販売されると、数量が差し引かれます。これにより、矛盾が生じました。私の意見では、これは正しいアプローチではありませんが、以前のプログラマーはそれを誓っています。

そのようなシステムを設計することが正しい方法であるかについてコンセンサスがあるかどうかを知りたい。また、これに関するガイダンスを求めるために利用可能なリソース(印刷物またはオンライン)。

ありがとう

役に立ちましたか?

解決

現在の会社で両方のアプローチを見てきましたが、最初のアプローチに間違いなく傾いていました(株式取引に基づいて合計を計算します)。

どこかのフィールドに合計数量のみを保存している場合、その番号にどのように到達したかわかりません。トランザクション履歴はないため、問題が発生する可能性があります。

私が書いた最後のシステムは、各トランザクションを正または負の数量を持つレコードとして保存することにより、在庫を追跡します。うまく機能していることがわかりました。

他のヒント

それは、在庫システムがアイテムを数えるだけではありません。たとえば、会計目的で、FIFO(先入れ先出し)モデルに基づいて在庫の会計値を知る必要がある場合があります。単純な「受け取った在庫の合計-売れた在庫の合計」では計算できません。式。しかし、彼らのモデルはこれを簡単に計算するかもしれません。なぜなら、彼らは経理値を変更するからです。これはプログラミングの問題ではないので、詳細には触れたくありませんが、もし彼らがそれを誓うなら、多分あなたは彼らが対応しなければならないすべての要件を完全に理解していなかったかもしれません。

両方は、状況に応じて有効です。前者は、次の条件が満たされる場合に最適です。

  • 合計するアイテムの数が比較的少ない
  • 考慮すべき例外的なケースはほとんどありません(リターン、調整など)
  • 在庫アイテムの数量はあまり必要ありません

一方、多数のアイテム、いくつかの例外的なケース、頻繁なアクセスがある場合、アイテムの数量を維持する方が効率的です

また、システムに矛盾がある場合は、バグがあることに注意してください。

iは両方の方法でシステムを実行しましたが、バグを無視しない限り、両方の方法で問題なく動作します!

ARTS(Association for Retail Technology Standards)データモデル( http://nrf-arts.org )。各アイテムのレコードを持つStockLedgerテーブルを使用し、インベントリへの変更はすべてInventoryJournalEntriesで追跡されます。

既存のシステムと、それを変更するコストとリスクを考慮することが重要です。私はあなたのようなインベントリを保存するデータベースを使用していますが、監査サイクルを含み、レシートと同様に調整を保存します。うまく機能しているように見えますが、関係者全員がよく訓練されており、倉庫のスタッフは新しい手順をすぐに学ぶことができません。

あなたの場合、データベース構造全体を変更せずにもう少し追跡したい場合は、追跡テーブル(「トランザクション」ソリューションのようなもの)を追加してから、インベントリへの変更を記録することをお勧めしますレベル。在庫レベルへのほとんどの変更を更新して、トランザクションレコードも残すようにするのはそれほど難しくないはずです。また、定期的なタスクを追加して、在庫レベルを数時間ごとにトランザクションテーブルにバックアップすることもできます。これにより、トランザクションを逃した場合でも、いつ変更が発生したか、以前の状態にロールバックできます。

SugarCRM を見て、大規模なアプリケーションがどのように動作するかを確認したい場合は、管理モジュール。ただし、データの保存方法はわかりません。

これは実際には、合計が必要になるたびに(比較的)高価なカウントを行うことと、何かが変わるたびにカウントを行うこと、そしてフィールドにカウントを保存してそのフィールドを読み取ることに関する一般的なベストプラクティスの質問だと思います合計が必要です。

トランザクションを使用できなかった場合、合計が必要になるたびにライブカウントを使用します。トランザクションが利用可能な場合、同じトランザクション内でインベントリ更新操作と再カウントされた合計の保存を実行しても安全です。これにより、カウントの精度が保証されます(複数のユーザーで機能するかどうかはわかりませんが)データベースにアクセスします)。

ただし、パフォーマンスがそれほど大きな問題ではない場合(そして、最新のデータベースで行のカウントが十分であるため、このことを心配することもめったにない場合)、毎回ライブカウントを維持します。

最初の方法を選択します。

  

手持ちの数量が計算されます   受け取った在庫の合計-合計   在庫販売

正しい方法、IMO。

編集:システムの在庫の損失/損害も考慮に入れたいと思いますが、それがカバーされていると確信しています。

私は以前、この問題を解決するシステムに取り組んできました。理想的な解決策は、事前に計算された列であり、両方の長所を活用できると思います。合計はどこかのフィールドであるため、高価なルックアップはありませんが、残りのデータと同期を取ることはできません(データベースは整合性を維持します)。どのRDMSが事前に計算された列をサポートしているかは覚えていませんが、トランザクションがない場合は利用できない可能性があります。

トリガーを使用して、事前に計算された列を偽造する可能性があります(非常に効果的に...マイナス面はありません)。ただし、おそらくトランザクションが必要になります。私見では、この種の制御された非正規化を行っているときにデータの整合性を保つことが、トリガーの唯一の正当な使用です。

Django-inventory は固定資産をより重視しましたが、アイデア。

IE:ItemTemplate(クラス)-> ItemsOnHand(インスタンス)

ItemsOnHandは、より多くのItemTemplatesにリンクできます。プリンターの例インクカートリッジが必要です。これにより、各ItemOnHandにリオーダーポイントを設定することもできます。

各ItemsOnHandはInventoryTransactionsにリンクされているため、簡単に監査できます。 数千の在庫トランザクションから実際の手持ちアイテムを計算することを避けるために、残高と日付だけのチェックポイントが使用されます。手持ちアイテムクエリを計算して最新のチェックポイントを見つけ、アイテムの追加または減算を開始してアイテムの現在の残高を見つけます。新しいチェックポイントを定期的に定義します。

2つの列を持つことにはいくつかの利点がありますが、不一致に関する部分をフォローしていません-2つの列(インとアウト)を持つことは、1つの列(現在)。なぜですか?

1つまたは2つの列がありません。「受け取った在庫の合計-売れた在庫の合計」という意味です。このようなものです:

Select sum(quantity) as inventory_received from Inventory_entry
Select sum(quantity) as inventory_sold from Sales_items

then

Qunatity_on_hand = inventory_received - inventory_sold

これと最初の説明を単純化しすぎたことに留意してください。在庫を管理するだけでなく、数量を追跡することもできることはわかっていますが、この場合は問題があり、修正したいことです。この時点で、変更する理由は、正確には現在の設計によって引き起こされる問題をサポートするためのコストです。

また、これは「コーディング」ではありませんが、質問は、私見が非常に重要なトピックであるアルゴリズムと設計に関連しています。

これまでの回答に感謝します。

ネルソンマーモル

さまざまな問題を解決しますが、それらのいくつかに対する私たちのアプローチは興味深いかもしれません。

システムが「最良の推測」を行うことを許可し、間違っていると思われる推測についてユーザーに定期的なフィードバックを提供します。

これを在庫に適用するには、次の3つのフィールドを使用できます。

inventory_received
inventory_sold
estimated_on_hand

その後、次の行に沿ってプロセスを実行できます(毎日?)

SELECT * 
FROM   Inventory
WHERE  estimated_on_hand != inventory_received - inventory_sold

もちろん、これはユーザーがこのアラートを見て、それについて何かをすることに依存しています。

また、inventory_sold / receivedを更新するか、正または負の別のフィールド「inventory_adjustment」を追加することにより、何らかの方法で在庫をリセットする機能を使用できます。

...いくつかの考え。役に立てば幸いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top