3

すでに Nhibernate で実行されているアプリを開発していますが、リレーショナル データベースで実装するのが難しいと思われるいくつかのユース ケースを処理するために RavenDb を使用することを検討しています。(例: EAV を使用しない動的フィールド)

このトピックに関するAyendeによるこの投稿で推奨されているこれを読みました。ただし、これが長期的に実用的かどうか、およびアプリケーションの動的フィールドを取得するためだけに 2 つのデータベースをサポートする必要がある場合にどのような一般的な落とし穴があるかについてはわかりません。

4

1 に答える 1

3

Ayendeからのリンクでは、彼は2つのデータベースを持つことを提唱していません。スキーマが拡張されて、エンティティに関する追加のメタデータを別のテーブルに格納できるようになるだけです。一部がNHibernateに、一部がRavenDBに移行する混合モードのDAレイヤーについて話している場合、分散トランザクション領域に入る可能性があります。これにより、スコープが大幅に拡大する可能性があります。

エンティティのテーブルに列を追加して、オブジェクトをそのテーブルにシリアル化できるようにすることも検討できます。たとえば、辞書の場合もあります(Jsonを使用することもできます)。後で複数のエンティティでクエリを実行する必要がない場合は、これで問題ありません。特定のエンティティを表示しているときにそのデータのみが必要な場合は、問題ありません。

私はこのアプローチを使用して、ユーザーの設定を保存しました。「設定カテゴリXの値がYであるすべてのユーザーを検索する」必要はありません。「ユーザーAのすべての設定のすべての値を教えてください」と言うだけです。

編集-XMLの保存
データベース内のシリアル化されたオブジェクトには、xmlデータ型を使用できます。以下のmsdnからのリンク:-SQLServerでの
XMLの実装

これは最大2GBになる可能性があるため、多くの動的な値を格納するためのスペースが不足しないようにする必要があります。このフィールドの流暢なマッピングは次のようになります。-

Map(x=>x.FieldForSerializedThing).CustomType("StringClob")
                                     .Column("[FieldForSerializedThing]")
                                     .Not.Nullable()
                                     .Access.CamelCaseField(Prefix.Underscore);

エンティティには次のようなフィールドがあります:-

public virtual System.String FieldForSerializedThing
{ 
    get { return _fieldForSerializedThing; }
    set { _fieldForSerializedThing = value; }
}

シリアル化を行う方法は他にもあると思いますが、これで穴から抜け出すことができます(ちなみに上記の例はSQL Serverの場合です)。

于 2013-01-08T16:52:25.800 に答える