1

products私は在庫管理データベースを開発していて、stocksエンティティ間の関係を行うための最良の方法を知りたいと思っています。

次のうちどれが適切ですか?ない場合は、その理由と提案を教えてください。

前もって感謝します

製品-在庫

上記のエンティティに基づく:

  • 関係がある場合は、ステートメント1:1で行を更新して、同じ行の在庫量を減らす必要があるようです。UPDATE

  • 1:n関係がある場合は、INSERTステートメントを使用して、更新された在庫量を含む新しい行を追加する必要があるようです。

重要なポイント

  • 増加および/または減少のように在庫を操作する同時ユーザーがいるので[ACID][1]、重要なポイントです。

  • Stock amountは非負の値です。

4

2 に答える 2

2

何を達成しようとしているかによって異なります。

製品の利用可能な数量を表す単純な数値が必要な場合は、それをフィールドとして製品テーブルに保存します。単一のステートメントで更新することはアトミックです。

UPDATE PRODUCT
SET AMOUNT = AMOUNT + <change>
WHERE PRODUCT_ID = <whatever>

または、次のようなこともできます。

START TRANSACTION;

SELECT AMOUNT
FROM PRODUCT
WHERE PRODUCT_ID = <whatever>
FOR UPDATE;

(Calculate new amount.)

UPDATE PRODUCT
SET AMOUNT = <new amount>
WHERE PRODUCT_ID = <whatever>;

COMMIT;

COMMIT まで行をロックし、それ以外の場合に並行環境で発生する可能性がある異常を防ぐ FOR UPDATE に注意してください。

FOR UPDATE がなければ、通常の ACID 保証だけでは十分ではありません。例えば:

  • トランザクションAは現在の AMOUNT を選択します。たとえば、5 とします。
  • トランザクションBは現在の AMOUNT を選択しますが、他のトランザクションがまだ変更をコミットしていないため、これはまだ 5 です。
  • トランザクションAは金額に 2 を加算し、結果は 7 になります。
  • トランザクションBは金額に 3 を追加し、結果は 8 になります。
  • トランザクションAは行を 7 に UPDATE し、コミットします。
  • トランザクションBは行を 8 に更新し、コミットします。

突然、5 + 2 + 3 = 10 になるはずだったテーブルの AMOUNT が 5 + 3 = 8 になりました。変更の 1 つが失われ、最後にコミットした人が勝ちます。


製品の金額の履歴が必要な場合、または製品の個々の「インスタンス」を追跡する必要がある場合は、はい、1:N の関係で別のテーブルが必要になります。これには、並行環境で独自のロックの問題がある可能性があります。


在庫量は非負の値です。

残念ながら、MySQL は CHECK 制約を強制しませんが、この特定のケースでは、単純にUNSIGNEDデータ型の 1 つを使用できます。

于 2013-01-29T11:47:22.047 に答える
1

depends特定のno. of users updating/inserting rows製品、またdepends onシステムがメモリのオーバーヘッドやパフォーマンスに耐えられるもの

での更新
で は、mysql - update needs write lockパフォーマンスの低下:多くのユーザーにとって、システムは挿入メモリのドレインが遅くなり ます:たとえば、100 人のユーザーの場合、100 行は 100 行を更新する場合があります。



あなた1:1 relation ship is betterが関係
を築いているのなら、1:n

在庫を増やすために:

-you 'll add new row .
-so for total stock 
       - you have to add all the subsequent rows,if new value you are inserting 
         is only the incremented amt 
       - or if it is the total increased amt the previous rows would not have
         any significance.

在庫を減らすため、同じ、

-if the total decrement amt you are inserting then the previous data has 
 no significance,
-but if only decrement value is there , so for every user you have to put 
 a check over the total stock which you would get from many rows.
于 2013-01-29T11:45:05.473 に答える