Ayendeは、 NHibernate Mapping – Inheritanceに関する投稿で、さまざまな NHibernate 継承戦略がどのように機能するかを概説しています。彼の union-subclass の説明は、さまざまなテーブルを結合するサブクエリを使用して生成された SQL を示しています。次に、このサブクエリが選択されます。
私が理解していないのは、このようにマップされたオブジェクトを参照するときに、サブクエリが参照された ID によって制限されない理由です。これは非常に効率が悪いように見えるので、私は心配しています。Companies テーブルと People テーブルのレコード数が増えると、それぞれからすべてを選択するのに時間がかかります。Parties オブジェクトの ID でサブクエリを単純に制限すると、すべてのレコードを後で制限するのではなく、少なくとも各テーブルから特定のレコードを取得することになります。
生成された SQL のポイントをよりよく説明すると、およそ次のようになります。
select this_.Id as Id2_0_,
this_.FirstName as FirstName3_0_,
this_.CompanyName as CompanyN1_4_0_,
this_.clazz_ as clazz_0_
from (select Id,
FirstName,
null as CompanyName,
1 as clazz_
from People
union all
select Id,
null as FirstName,
CompanyName,
2 as clazz_
from Companies) this_
where Id = 123
特定のパーティを参照するときに、生成された SQL が正しくないのはなぜですか?
select this_.Id as Id2_0_,
this_.FirstName as FirstName3_0_,
this_.CompanyName as CompanyN1_4_0_,
this_.clazz_ as clazz_0_
from (select Id,
FirstName,
null as CompanyName,
1 as clazz_
from People
where Id = 123
union all
select Id,
null as FirstName,
CompanyName,
2 as clazz_
from Companies
where Id = 123) this_
2 番目の方法はより効率的で、Company テーブルと People テーブルが大きくなっても適切なインデックス作成が損なわれないことを前提としています。この質問は、私の質問へのさらなる調査によって引き起こされました: how to map a UnionSubclass so that queries generated from it are limited .