私は、スキーマのないデータの保存/取得を含む一連の特定の要件を解決する手段として、多数の NoSQL 実装 (現時点では RavenDB と MongoDB) を評価しています。NoSQL が私が検討すべき方向であるかどうか、または他の (より単純な可能性がある) オプションがあるかどうかについて、フィードバックを得たいと考えています。
基本的に、(とりわけ) いくつかの関連するエンティティで構成される基本的なドメイン モデルを定義するソフトウェア製品があり、それぞれがいくつかの属性 (キー/値) を持っています。お客様にリリースするときに、お客様と協力して属性と値を設定します。これは基本的にシステムの構成です。これは非常に簡単で、設計が事前にわかっているため、これを実現して実行するために動的なものは必要ありません (RDBMS を使用します)。属性は前もって知られていませんが、システムのこの部分はほとんど属性モデルを中心に展開しているため、これも問題ではありません。
問題は、さまざまな顧客にとって、コードをコンパイルしてリリースしたとき (および、顧客)。基本的には、格納できる属性マップからデータを生成し (構造は前もってわかりません)、格納されたデータを後で予測できない方法でクエリする必要があります。現在考えていることは、処理中にヒットするフックを作成し、データを作成して保存するライブラリを (おそらく MEF 経由で) プラグインできるようにし、後で必要に応じてクエリを実行できるようにすることです (レポート用ではありません)。通常、追加のデータ/属性を作成します)。
(フックとプラグイン ライブラリの作成は別の問題であり、この質問の一部になることを意図していないことに注意してください。)
一般的なシナリオは、「過去 10 日間に xxx が発生した回数を知りたい」です。そこで、xxx が発生したことを認識するプラグインを作成し、それを日付/時刻とともにデータ ストアに書き込みます。次に、クエリを実行する別のプラグイン (おそらく同じ DLL 内) を作成し、「CountOfxxxInLast10Days」というモデルに属性を追加します。もう 1 つのシナリオは、構成可能なルックアップを作成することです。そのため、起動時に実行して、ある属性値を別の属性値に変換できるルックアップ データのテーブルを作成/更新するプラグイン、または (より可能性が高い) ルックアップ値に変換する値の範囲を作成するプラグインを用意する場合があります。そのため、変換プラグインは、bottom_value、top_value、乗数の列を持つテーブルを追加し、クエリ プラグインは、"
場合によっては、指定した期間が経過すると古いデータが消去されることがあります。上記の最初のシナリオでは、ストア/キャッシュから 10 日より古いデータを削除することが望ましい場合があります。
上記の 2 番目のシナリオのように、データを永続的に保持する必要がある場合もあります。このデータは、永続的なストアに保持されるのではなく、起動時に単純に再作成される可能性があります。
追加要件:
- オンライン中にデータストア/キャッシュをバックアップおよび復元できます
- クラッシュの場合、最後のバックアップから置き換え/回復可能
- データは、マシンの再起動などのイベントに耐えます
- 実証済み/生産テスト済みのテクノロジー
現時点では、.Net プラットフォームにかなり力を入れているため、どのオプションも確実な .Net クライアント/API を備えている必要があります。