1

Orderに多くのLineアイテムがあり、オーダーの合計コスト (オーダー ラインの価格の合計に基づく) をオーダー テーブルに格納しているとします。

--------------
orders
--------------
id
ref
total_cost
--------------

--------------
lines
--------------
id
order_id
price
--------------

単純なアプリケーションでは、チェックアウト プロセスの同じステップで注文と明細行が作成されます。つまり、これは

INSERT INTO orders .... 

-- Get ID of inserted order record
INSERT into lines VALUES(null, order_id, ...), ...

注文レコードを作成した後、注文 ID を取得します。

私が抱えている問題は、注文の総費用を保存する最良の方法を見つけようとしていることです. する必要はありません

  1. 注文を作成する
  2. 受注明細の作成
  3. 明細行に基づいて注文のコストを計算し、注文テーブルで 1. で作成したレコードを更新します

これは、スターターの注文で null 可能な total_cost フィールドを意味します...

これまでの私の解決策は、orders テーブルと 1:1 の関係を持つorder_totalsテーブルを持つことです。しかし、それは冗長だと思います。理想的には、総コスト (オーダーの行数) を計算するために必要なすべてがデータベースにあるため、必要になるたびに値を計算しますが、これは非常にコストがかかります。

あなたの考えは何ですか?

4

5 に答える 5

3

注文合計の列やテーブルはない方がいいと思います。

表示する必要があるときはいつでも、ラインレコードを合計して注文合計を計算するだけです。行レコードが変更された場合、注文の合計価格を更新するには、別の列またはテーブルを常に維持する必要があると想像してください。

于 2012-06-28T21:02:29.110 に答える
3

このテーブルは、orders テーブルの列として格納できるため、必要ありません。

新しい列として保存する価値があるかどうかは、値を読み取る回数と行った変更 (および計算コスト) によって異なります。

頻繁に読み取られるがあまり頻繁に変更されず、計算に許容できないほどの時間がかかる場合は、新しい合計列を維持する価値があります。それ以外の場合は、おそらくビューを介して毎回計算する方がよいため、選択されたすべての場所で計算をコーディングする必要はありません。

于 2012-06-28T21:05:54.730 に答える
2

私は他のコメント提供者に同意します。ラインアイテムの合計コストを計算するのにリソース的に非常に費用がかかる場合を除いて、SUM /GROUPBYクエリを使用してその場で計算するのが最善です。

ただし、それでも事前の総コスト計算を行いたい場合は、SQL挿入の実行を開始する前に、メモリ内で計算してください。結局のところ、ラインアイテムに挿入するデータがあるので、それらを繰り返し処理して最初に合計コストを合計してから、合計コストで注文レコードを作成します。その後、広告申込情報を挿入します。

于 2012-06-28T21:15:38.917 に答える
2

他の人が示唆しているように、その場で合計を計算する方がおそらく良いでしょう。

InnoDB がそのテーブルをクラスター化することを追加したいので、PK をlines正しく選択すると、同じ注文の行が物理的に近くに保存され、注文全体の合計を最小限の I で計算できるようになります。 /O (つまり、非常に迅速に)。

これを行うには、代理 PK in を破棄しlines、自然な PK: を使用します{order_id, line_no}

于 2012-06-28T21:32:25.787 に答える
2

私は他の答えをエコーし​​ 、そうするのが容認できないほど高価でない限り、lines必要に応じてテーブルから総コストを計算すると言います。

または、必要に応じて更新するトリガーを定義することもできますorders.total_costINSERTただし、 afterUPDATEおよびDELETEonのトリガーを定義する必要がありますlines

CREATE TRIGGER after_insert_lines AFTER INSERT ON lines FOR EACH ROW
  UPDATE orders SET total_cost = total_cost + NEW.price;

CREATE TRIGGER after_update_lines AFTER UPDATE ON lines FOR EACH ROW
  UPDATE orders SET total_cost = total_cost - OLD.price + NEW.price;

CREATE TRIGGER after_delete_lines AFTER DELETE ON lines FOR EACH ROW
  UPDATE orders SET total_cost = total_cost - OLD.price;
于 2012-06-28T21:33:47.200 に答える