作業単位 - Web ファームでオブジェクトを一時的に保存するための最良のアプローチは何ですか?

StackOverflow https://stackoverflow.com/questions/1521349

  •  19-09-2019
  •  | 
  •  

質問

Martin Fowler が「作業単位」パターンと呼ぶものに似たものを設計して実装する必要があります。他の人がこれを「ショッピング カート」パターンと呼んでいるのを聞いたことがありますが、ニーズが同じであるとは思えません。

具体的な問題は、ユーザー (および UI チーム) が、親オブジェクトが作成される前に、子オブジェクト (データベース内の参照整合性制約付き) を作成して割り当てることができるようにしたいことです。今日、私は別のデザイナーと会い、2 つの代替アプローチを考え出しました。

a) まず、データベースにダミーの親オブジェクトを作成し、次にダミーの子とダミーの割り当てを作成します。データベース内の羊とヤギを区別するには、負のキー (通常のキーはすべて正です) を使用できます。次に、ユーザーがトランザクション全体を送信するときに、データを更新し、実際のキーを追加して調整する必要があります。

これにはいくつかの欠点があると思います。

  • それはインデックスに混乱を引き起こします。
  • 固有の制約を持つ列に対する一意の制約を満たすための方法を考え出す必要があります。
  • 多くの WHERE 句にさらに別の述語を追加するには、多くの既存の SQL と SQL を生成するコードを変更する必要があります。
  • Oracle の主キーを変更することは可能ですが、それは困難です。

b) これらの逆トランザクションに参加できるようにする必要があるオブジェクトと割り当ての一時テーブルを作成します。ユーザーが「送信」をクリックすると、実際のエントリが生成され、古いエントリが消去されます。

これは最初の代替案よりもクリーンだと思いますが、それでもデータベース アクティビティのレベルが増加します。

どちらの方法でも、ユーザーがリクエストの送信またはキャンセルを実行する前にセッションが失われた場合に、一時データを期限切れにする何らかの方法が必要です。

別の方法でこの問題を解決した人はいますか?

よろしくお願いいたします。

役に立ちましたか?

解決

これらのオブジェクトは、トランザクションがコミットされる前に、データベースに作成する必要があり、なぜ私は理解していないので、あなたは解決策を進める前に、あなたのUIチームに明確にしたい場合があります。あなたは、彼らがやりたいすべてが以前に別のページ上のユーザーによって保存された情報を読み取るされることがあります。

だから、コミットする前にオブジェクトをデータベースに格納する必要がないと仮定し、私はあなたがCを計画与えます:

ストアは、セッション中に、ビジネス・オブジェクトを初期化します。あなたは、あなたが望むすべての子を作成し、トランザクションをコミットする必要があるときにのみデータベースに触れる(と参照を設定する)ことができます。セッションデータが(個別にまたは総称して)大きくなるように起こっている場合は、(あなたはすでにこれを実行することができる)データベースにセッション情報を保存します。

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