2 つのオプション
NHibernate を使用して単一のドメイン モデルでリンクしようとしている複数のデータベースまたは複数のデータベース サーバーがある場合、基本的に 2 つのオプションがあります。
- データベース サーバーの機能 (リンクされたサーバーなど) を活用してデータを結合し、NHibernate が 1 つのデータベースへの接続だけを心配する必要があるようにします。NHibernate マッピングでは、
table
属性を完全に指定して、データベース サーバーが他のデータベース サーバーに対してクエリを実行することを認識できるようにします。「代理キー、...主キーではない」の場合、 を使用してこれをマップできます<many-to-one property-ref="...">
。
- データベースごとに 1 つずつ、複数の NHibernate セッション ファクトリを使用します。どのデータベースから何をロードするかを調整する責任があります。各セッション ファクトリは、そのデータベースに存在するテーブルに対してのみ構成し、適切な接続文字列を使用します。次に、データをロードするために、2 つのクエリを実行します。1 つは 1 つのデータベースに対して、もう 1 つは他のデータベースに対して実行します。
どれ?
正しい選択はどれですか? 場合によります...
利用可能な機能
データベース サーバーに #1 をサポートする機能がない場合、またはそれらの機能を使用できない理由が他にある場合は、明らかに #2 を使用する必要があります。
クロス DBwhere
句
#1 により、クエリを作成する際の柔軟性が向上しwhere
ます。必要に応じて、両方のデータベースにまたがる句を指定できますが、作成するクエリでデータベース A がデータベース B から大量のデータをフェッチする必要がないことに注意する必要があります。方法 2 では、データベース B から必要なものを取得するために 2 番目のクエリを実行します。これにより、ジョブを完了するために各データベースからフェッチする必要があるデータについて、より正確に意識する必要があります。
強制されていない関係
データは 2 つの異なるデータベースに存在するため、関係を強制する外部キーはありません。NHibernate は (非常に合理的に) データベースの関係が外部キーによって強制されることを前提としています。これら 2 つのデータベースが同期していない可能性があるため、#1 では、パフォーマンスに影響する などに頼る必要がnot-found="ignore"
あります。
展開の複雑さ
データベース間の関係により、さまざまな環境 (DEV、QA、PROD) へのデプロイが困難になります。アプリケーションとデータベースを展開するだけではなく、アプリケーションの接続文字列が正しいデータベースを指していることを確認してください。代わりに、データベース内の他のデータベースへの参照が正しい場所を指していることも確認する必要があります。
上記のすべての要因を考えると、私は通常、オプション 2 に傾倒しますが、1 番の方がはるかに便利な場合もあります。