3

私はいくつかのグラフを持っています。各グラフの幅と深さは変化する可能性があり、実行時に変更や変更が加えられます。グラフの例を参照してください。

ここに画像の説明を入力

グラフ全体 (つまりツリー) を保持するためのルート ノードがあります。ノードは複数の子を持つことができ、各子は特別な目的を果たします。さらに、特定の情報を取得するために、ノードはすべての直接の子にアクセスできます。一方、子ノードは、それ自体の親ノードも他の兄弟ノードも認識しない場合があります。これまでのところ、目を見張るものはありません。

各グラフを格納し、オブジェクト データベース (この場合は DB4O) を使用して更新することは、非常に簡単に見えます。リレーショナル データベースを使用してデータの永続性 (データベース トリガーなどを含む) を実現することもできましたが、代わりにオブジェクト データベースでそれを実現したいと考えました。

私のグラフには奇妙な点が 1 つあります。別のグラフの例を参照してください。

ここに画像の説明を入力

計算を適切に実行するために、一部のノードは他のノードからの情報を必要とします。これらの他のノードは、兄弟、子供/孫、または他の種類の関連である可能性があります。この場合、特定のノードは他の関連するノードも認識しています (したがって、それらから必要な情報を直接取得できます)。簡単にするために、最初の画像はすべての潜在的な接続を示していません。

1 つのノードの状態が変化した場合 (たとえば、内部タイマーによってトリガーされた、または他のノードによってトリガーされた)、他のノード (関心のあるオブザーバー、オブザーバー パターンも参照) にその変更について通知します。通知を受けた各ノードは、適切なアクションを実行して自身の状態を更新します (そして、必要に応じて他のオブザーバーに通知します)。何かが変更されたことを知っているのは関係するノードだけなので、ルート ノードは発生したすべての変更を認識しているわけではありません。このような一連のイベントがルート ノードによってトリガーされた場合、もちろん大きな問題にはなりません。

目的は、オブジェクト データベースでデータの永続性を保証することです。メモリ内のデータは、データベース内に保存されているデータと同期している必要があります。複雑さを増しているのは、グラフが単純な (そしてばかげた) データ ノードで構成されていないという事実ですが、多くの機能が各ノードに統合されているという事実です (つまり、グラフ全体の状態変化をトリガーするイベント)。

提示された問題に対処する方法について、大まかなアイデアがいくつかあります (例: (1) データと機能をより強力に分離する、(2) データベースをより強力に統合する、(3) データを更新する間隔を任意に設定し、データが更新される可能性があることを受け入れる)。一定期間同期がとれない)。私は、そのような重要な問題に関するいくつかの入力とオプションを探しています (これは、具体的な実装に大きな影響を与えることは間違いありません)。

(編集済み) 言い忘れた別の側面があります。グラフは常にメモリに常駐するべきではありません。不要なグラフはデータベースにのみ存在するため、停止状態になります。これは、考慮が必要なもう 1 つの問題です。一時停止中は、更新メカニズムもスリープ状態になる可能性がありますが、これは意図したものではありません。

4

2 に答える 2

1

db4o の場合、「透過的なアクティブ化」をチェックして、グラフをトラバースするときにオンデマンドでオブジェクトを自動的にロードし (この方法では、グラフがすべてメモリ内にある必要はありません)、「透過的な永続性」をチェックして、各ノードを永続化できるようにします。状態変化後のそれ自体。

http://www.gamlor.info/wordpress/2009/12/db4o-transparent-persistence/

さらに、db4o「コールバック」を使用して、db4o 操作中にカスタム動作をトリガーできます。

HTH

ドイツ人

于 2011-12-05T13:02:29.830 に答える
1

正確な質問は何ですか?ここにいくつかのコメントがあります:

@German が既に述べたように: 複雑なオブジェクト グラフの場合は、おそらくtransparent persistenceを使用する必要があります。

@German の言及としても:コールバックは、オブジェクトがデータベース上で読み書きされるときなどに追加の作業を行うのに役立ちます。

オブザーバーパターンへ。.NET または Java を使用していますか? 通常、オブザーバーはビジネス ロジックや GUI などの一部であるため、オブザーバーをデータベースに保存することは望ましくありません。.NET では、イベントは自動的に保存されません。Java では、オブザーバー参照を保持するフィールドを一時的なものとしてマークしてください。

たとえば、オブザーバーがオブジェクトグラフの単なる他の要素であるなどの理由で、実際にオブザーバーを保存したい場合。.NET では、デリゲート / クロージャを格納できません。そのため、オブザーバーを呼び出すためのインターフェイスを導入する必要があります。Java の場合: 多くの場合、匿名の内部クラスをリスナーとして使用します: db4o はそれらを格納できますが、それはお勧めしません。匿名の内部クラスは、変更可能な生成された名前を取得するためです。コードを変更した場合、db4o は後でそのクラスを見つけられません。

それでおしまい。さらに詳しく知りたい場合は、より詳細な質問をしてください。

于 2011-12-05T17:08:30.523 に答える