6

データベースにはすでに多くの既存データがあり、ユーザーの行動に基づいて各ユーザーのスコアを計算するポイント メカニズムを開発したいと考えています。

私はこの機能をプラグイン可能な方法で実装しているため、エンティティが変更されると、メイン ロジックから独立し、送信される Spring イベントに依存します。

問題は、既存のデータをどうするかです。今からポイントを集めるのではなく、今までのすべてのデータを含めたいと思います。

これを行うための最も実用的な方法は何ですか? index() メソッドを提供するようにプラグインを設計する必要があります。これにより、システムはデータベースからすべてのエンティティを取得し、EntityDirtyEvent を送信して、ポイント プラグインを起動し、更新する必要があります。各エンティティの横にポイントを保存できるようにします。その結果、多くのオーバーヘッドが発生する可能性がありますよね?

最も簡単なのは、複雑なストアド プロシージャを作成し、そのストアド プロシージャを index() で呼び出すことです。しかし、それは私には悪いことのようにも思えます。ポイントを計算するためのロジックはとにかく Java で書かなければならないのに、なぜもう一度 SQL で書く必要があるのでしょうか。また、一般的に、私はビジネス ロジックを異なるレイヤーに分割することは好きではありません。

誰もこれを以前にやったことがありますか?助けてください。

4

5 に答える 5

4

まず、実装戦略とビジネス ルールを区別しましょう。

既にデータがあるので、データから直接結果を取得することを検討してください。これにより、データ ドメイン モデルが形成されます。すべてのデータを格納するデータ モデルを設計します。次に、一連のクエリ、ビュー、およびストアド プロシージャを作成して、データにアクセスして更新します。

これらのビューを取得したら、Spring JDBC テンプレートなどのデータ アクセス ライブラリを使用してこのデータを取得し、それらを Java オブジェクト (リスト、マップ、人物、ポイント テーブルなど) に表現します。

システムの上位層で何が起こっても、これまでに完了したことはあまり変わりません。これをモデルと呼びます。

次に、どの入力、ユーザー アクション、データ条件、またはその他すべての条件の下で、どのデータが必要かを判断するルール ベースまたはロジック実装を開発します。数学的な意味では、これは行列のようなものです。プログラミングの意味では、これは論理ステートメントのセットになります。this と this と this が true の場合は、このデータを取得し、そうでない場合はそのデータを取得します。これには、システム内のロジックが含まれます。したがって、「コントローラー」と呼ばれます。

このロジックをクエリ/ストアド プロシージャ/ビューに移動しないでください。

最後に、このためのフロントエンドまたは「コンソール」を開発します。最も単純なケースでは、.. を受け取り、一連の結果を表示するコンソール入力システムを開発します。これがシステムの「ビュー」です。

最終的に、ビューを Web アプリケーションに開発できます。上記のコマンド ライン ビューは、Restful API サーバーの形式で引き続き実行できます。

于 2012-07-27T16:02:02.957 に答える
2

あなたは正しい方向に向かっているようです。「ポイント」をメインアプリケーションから分離したいことはわかっています。すでに休止状態を使用していることを意味するため (タグで!)、休止状態イベント システムを利用できます (セクション 14.2 を参照)。システムのサイズ/複雑さに応じて、ここでポイント計算をプラグインするか (大規模/複雑なシステムでない場合)、独自のイベントを公開して、リッスンしているソフトウェアによってピックアップされるようにすることができます。

どちらの設計アプローチでもポイントは、どちらもポイントの計算を認識していない、または気にしていないということです。私が推測しているように、かなり汎用的なプラグイン メカニズムを作成しようとしている場合は、このタイイン ポイントからそのシステムに独自のイベントを発行します。次に、特定のインストール/セットアップにプラグインがない場合、誰もイベントを取得/処理しません。別のインストール/セットアップに複数のプラグインがある場合、それぞれが受信したイベントに基づいて実行する必要がある処理を決定できます。「ポイントプラグイン」の場合、ポイント値を計算して保存します。ストアド プロシージャは不要です....

于 2012-08-07T12:41:59.240 に答える
2

「ブートストラップ」を達成しようとしています。どのアプローチを選択するかは、ポイントの計算がどれほど複雑かによって異なります。ストアド プロシージャまたは単純な更新ステートメントが最も簡単な解決策である場合は、それを実行してください。

計算が複雑な場合は、既存のデータをロードするバッチ ジョブを作成し、おそらく最も古いものから順に並べ、そのデータに対応するイベントを発生したかのように発生させます。イベントを処理するコードは、将来のイベントを処理するコードとまったく同じである必要があるため、バッチ ジョブ自体以外に追加のコードを記述する必要はありません。

この処理は 1 回しか実行しないため、たとえそれが迅速で汚れていても、最も単純なソリューションを使用してください。

于 2012-08-07T12:10:11.390 に答える
1

2つの異なる方法があります。1つは、すでに知っていることです。データベースをポーリングして、変更されたデータを探します。その場合、変更がない可能性があり、プロセスが遅くなる可能性があるときにデータベースにアクセスしています。

2番目のアプローチ-データベースに変更が発生するたびに、データベースはイベントを発生させます。CDC(Change Data Capture)を使用できること。オーバーヘッドを最小限に抑えます。

SpringIntegrationで他のオプションを探すことができます

于 2012-08-08T06:48:44.090 に答える