データベースから大量のデータをロードし、そのデータに対してアルゴリズムを実行するC ++アプリケーションがあります(これらのアルゴリズムはCPUとデータを大量に消費するため、事前にすべてのデータをロードします)。データベースに戻しました。
データベース部分は、アプリケーションの他の部分からうまく分離されています。実際、アプリケーションはデータの出所を知る必要はありません。アプリケーションをファイルで起動することもできます(この場合、別のファイルモジュールがファイルをアプリケーションにロードし、最後にすべてのデータをファイルに保存します)。
今:
- データベース層は、変更されたインスタンスを(完全なデータではなく)データベースに保存するだけでよいため、アプリケーションによって何が変更されたかを知る必要があります。
- 一方、アプリケーションはデータの出所を知る必要がないため、データのインスタンスごとに状態の変化を維持することを余儀なくされていると感じたくありません。
アプリケーションとそのデータ構造を、データ(データベースまたはファイル)をロードおよび保存するレイヤーから可能な限り分離するために、起動後にインスタンスが変更されたかどうかに関する情報でアプリケーションのデータ構造を汚染したくありませんか否か。
ただし、データベースレイヤーを可能な限り効率的にするには、アプリケーションによって変更されたデータを判別する方法が必要です。
データは数GBのメモリを簡単にいっぱいにする可能性があるため、すべてのデータを複製して保存しながらデータを比較することはできません。
アプリケーションアルゴリズム内のパフォーマンスが非常に重要であるため、アプリケーションデータ構造にオブザーバーを追加することもできません(すべてのオブザーバーをループして仮想関数を呼び出すと、アルゴリズムに重大なパフォーマンスのボトルネックが発生する可能性があります)。
他の解決策はありますか?または、邪魔な方法でアプリケーションクラスにロジックを追加したくない場合は、「モジュラー」になりすぎないようにしていますか?これらの場合、実用的である方が良いですか?
ORMツールはこの問題をどのように解決しますか?また、アプリケーションクラスに一種の変更状態を保持するように強制しますか、それともクラスに変更オブザーバーを強制しますか?