0

これは、pht の ORM における select n + 1 問題の簡単な例を提供しますが、考え方は他の言語の ORM でも同じであるはずです。

典型的な解決策は、熱心な読み込みを使用してクエリを 1 つに減らすことです。これはそれほど難しいことではないと思いますが、OTOH、後者のリファクタリングでは開発者が 2 つの場所を変更する必要があるため、非常に脆弱です。それ以外の場合は、この select n + 1 問題が再発します。

私の直感では、パス分析を行って、これらの子属性がコードの後半で使用されることを把握できるはずです。そのため、必要なすべての情報を一度に収集するクエリを生成しましょう。

これは、Ruby や php などの解釈された言語を使用して実装された ORM を要求するには、おそらく多すぎるでしょう。しかし、Java (NHibernate) も C# (エンティティ フレームワーク) も、このパス分析を行っていません。どうしてこれなの?

4

1 に答える 1

0

理解できません。EntityFramework を使用する場合、Include(....) を使用して、同じクエリでロードする遅延ロード可能な子関係エンティティを指定できます。また、そのフィールドを考慮した句を指定すると、エンティティが含まれている場合、単一のリクエストを取得します (簡単に言えば、linq クエリで結合を使用するだけです)。

ところで、ここであなたのような古い関連する質問を見つけることができます: What is SELECT N+1?

以下でコメントしたように、必要なすべてのインクルードを追加するために呼び出すメソッドを持つ方法があるため、新しいナビゲート可能なプロパティ/コレクションを追加するときに、そこに追加することを忘れないでください。この回答は概念を示しています: https://stackoverflow.com/a/14520939/1716620

于 2015-12-07T22:54:24.917 に答える