2

RDBMSの在庫管理システムのデータモデルをどのように設計しますか?

あなたは:

  1. 各購入と使用量を保存し、SUM()とGROUP BYを使用して、オンザフライで倉庫の数量を計算しますか?
  2. 1と同じですが、毎日数量を統合し、前日の値を使用しますか?
  3. Intフィールドとしての数量、アプリケーション層を介して更新しますか?
  4. 3と同じですが、DBトリガーを利用しますか?

トランザクションベースの在庫システムは、キャプチャする詳細レベルの点では優れているように見えますが、正しく実装するのは困難です。時間の経過とともにパフォーマンスが低下します。

数量ベースの在庫システムははるかに簡単に見えますが、数量値が++または--正しいことを確認するために追加のロックが必要になる場合があります。

どちらを選びますか?

4

2 に答える 2

3

私はおそらくトリガールートに行き、トランザクションがデータベースにプッシュされるときに数量を更新します。これにより、一連のサブクエリや計算を必要とせずに、現在の数量を簡単に確認できます。

トリガーで実行された場合、トランザクションの発生元に関係なく、在庫テーブルの数量が常に更新されるようにすることができます(ハードINSERTまたはアプリケーションを介して追加されたトランザクションがあるかどうかに関係なく)。

ロギングの懸念がある場合は、いくつかのロギングをトリガーにラップして、前後の量を別のロギングテーブルに追跡します。

トリガーは次のようになります(テストされていません):

CREATE TRIGGER [dbo].[OrderAdded] 
   ON  [dbo].[Orders] 
   AFTER INSERT
AS 
BEGIN
    DELCARE @ProductID int; DECLARE @Qty int;
    SET @ProductID = (SELECT ProductID FROM inserted);
    SET @Qty = (SELECT Qty FROM inserted);
    UPDATE StockTable 
    SET Stock = Stock - @Qty
    WHERE ID = @ProductID

END

IDフィールドとStockフィールドのインデックスが適切に設定されている限り、パフォーマンスの問題が発生することはないと思いますStockTable(もちろん、提供しなかった場合は、これらすべてを作成します。 DB情報)。

于 2011-03-17T14:40:25.597 に答える
2

監査証跡が重要な場合は、トランザクションデータが必要です。そして、私はそれがなかった実際のシステムを見たことがありません。

パフォーマンスに関する限り、私は次のようにします。

  1. 非正規化された値を定期的にキャプチャします-たとえば、1時間ごとまたは1日ごと
  2. この非正規化プロセスに関係するトランザクションレコードを別のテーブルに移動します(つまり、「現在」から「倉庫」に)。

その場合、合計は、この非正規化された値と現在のトランザクションの合計になります。

このアプローチでは、トランザクションレコードの数が使用可能なディスク容量を超える可能性があるため、バックアップも容易になります。たとえば、倉庫をテープバックアップに書き出します。

于 2011-03-17T16:43:09.700 に答える