私は、遅延読み込みと呼ばれる ORM の機能について読んでいました。これは、アプリケーションが実際にそれらを必要とする場合にのみ、より大きな列が読み込まれることを意味します。ORM は「大きな列」とは何かをどのように判断しますか? たとえば、符号なし整数列と比較して、大量のデータを格納できる blob 列でしょうか? また、列の遅延読み込みと表示されている場合、これは、クエリを実行すると、期待どおりに大きな列の一部の結果が得られない可能性があることを意味しますか?
4 に答える
NHibernatesの場合、遅延読み込みは、コレクションプロパティにアクセスするまで、オブジェクトへのコレクションプロパティの読み込みを妨げます(通常は別のテーブルを結合するか、サブ選択します)。
たとえば、すべての顧客をロードしたいが、顧客に注文プロパティ(注文のコレクション)がある場合は、注文なしですべての顧客をロードし、必要に応じて特定の顧客の注文を遅延ロードできます。注文を参照してください。
これにより、必ずしもすべてのデータを事前に必要としない場合に、多くのデータベース呼び出しを節約できます。
問題の特定のオブジェクト/コレクションを作成するときではなく、データにアクセスするときにデータがフェッチされます。
したがって、(擬似コード)のようなもの:
private void doNothing(int id)
{
PersistentObject po = BetByID<PersistentObject>(id)
}
実際にデータベースに触れることはありません。一方:
private void doSomething(int id)
{
PersistenObject po = GetByID<PersistentObject>(id)
Console.Write(po.id.ToString()) // <- object is fetched here
}
はい、blob列はそれとまったく同じように聞こえます。大きなVARCHARや同様のものもそれに該当する可能性があります。
つまり、小さい列はメモリにキャッシュされますが、大きい列を読み取ると、値が返される前にデータベースの読み取りがトリガーされます。
または、少なくとも、それはあなたが言っていることのおそらく解釈です。正確には、どのORMですか?
一般的なアプローチは、より大きなプロパティを「遅延読み込み」でマークすることです。Xmlマッピングまたは属性を使用します。たとえば、DataObjects.NETの場合、[Field(LazyLoad = true)]プロパティ属性を使用する必要があります。