0

結合テーブルを最適に更新する方法について少し混乱しています。

Presentaion
id PK

Asset
id PK

PresentationAsset
presentationid
assetid

したがって、PresentationAsset内のプレゼンテーションとそれに関連するアセットを更新する場合、最初にすべての関係を検索し、それらを削除してから、新しい関係を作成しますか?

このようなシナリオへの最善のアプローチは何ですか?

4

2 に答える 2

1

少なくとも、それらをすべて削除して新しいものを作成するのが確かに最も簡単です。結局のところ、それはたった2つのクエリです。

DELETE FROM PresentationAsset WHERE presentationid = 1
INSERT INTO PresentationAsset VALUES (1, 1), (1, 2), (1, 3)

それらが実際にそのテーブルの2つの列だけであると仮定すると(たとえば、タイムスタンプなどはありません)、それ以上に複雑にする必要がある理由は想像できません。

結局のところ、既存の行を消去してすべての新しい行を挿入する代わりに、既存の行を保持し、不要になった行を削除して、新しい行を挿入することもできます。基本的に、まだ少なくとも1つとDELETE1つINSERTになっているので、ほとんどの実際のアプリケーションでパフォーマンスに大きな違いはないはずです。最初のアプローチでは、操作ごとの値チェックが少なくて済むため、パフォーマンスがさらに向上する可能性があります。

もちろん、このようなわずかなパフォーマンスの違いが重要になる十分な大きさのシナリオで作業している場合は、すべてのオプションの実際のテストを実行して、パフォーマンスを自分で測定することをお勧めします。

もちろん、テーブルの2つの列だけではない場合は、更新する行の他の列の値を適切に保持する必要があるため、すべてを削除して新しい列を挿入することはできません。とりあえず。

于 2012-04-08T05:55:08.400 に答える
0

2つのオプションがあります:

1)すべてのアセットを削除し、前述のように新しいアセットを作成します(defはコーディングが簡単で、デバッグも簡単です。PresentationAssetにPKがない場合、いくつかの削除で大量のデータが残る可能性があるという唯一の問題があります。 PresentationAsset PKで。)

2)これを(擬似コードで)行う

  • 現在プレゼンテーションに関連付けられているアセットからすべてのIDを取得します(古い値)。これをarray1と呼びます
  • 新しい値の各アセットについて:
    • すでに存在する場合は、新しい値で更新し、array1からIDを削除します。
    • そうでない場合は、作成します
  • PresentationId = currentPresentationId AND AssetIdINarray1であるすべてのPresentationAssetを削除します

それが十分に明確であり、私があなたの問題を正しく理解したことを願っています;)私は1)で生きることができると思いますが、2)はおそらくより良いでしょう。更新が必要な値を更新し、削除された値を削除します。

于 2012-04-08T05:49:33.820 に答える