2011-07-18 7 views
1

私は3つのオブジェクト - Brands,CategoriesおよびProductsを持つシステムを持っています。 ORMとしてNhibernateを使用しています。ブランドをロードする - >カテゴリー - >製品hiearchy効率的

商品は1つのbrandと複数のCategoriesに割り当てられています。 Googleが構築しているeコマースのウェブサイトでは、左側にブランドメニューを表示する必要があります。各ブランドについて、そのブランドの製品のみを持つカテゴリーを表示することです。

たとえば、キャンプ、ハイキング、クライミング、3つのブランドA、B、Cの3つのカテゴリがあるとします。ブランドAに「クライミング」カテゴリの商品がない場合、そのカテゴリは表示されません。

この問題を効率的に処理する方法が問題です。各ブランドについては、各カテゴリを通過し、そのカテゴリの下に現在のブランドの商品が少なくとも1つ存在するかどうかを確認する必要があります。 200のカテゴリーと20のブランドでは、最悪のケースで約2000件のデータベース呼び出しが発生します。

他のオプションは、すべての製品をメモリに読み込むことですが、多くの製品(20,000 +)がある場合は、この方法も遅くなります。

もっと速くロードできるように、私ができるアイデアや最適化はありますか?

+0

あなたはどのデータベースを使用していますか? – Tridus

答えて

0

QueryOverを使用すると、ブランドごとにそのカテゴリとそのカテゴリの商品数を取得できます。 (私は現在、私の参照へのアクセスを持っていないので、これは100%正確ではないかもしれないが、あなたは私の意味を取得することができます)の効果に何か:

QueryOver<Brand>() 
    .JoinQueryOver(b => b.Categories) 
    .Select(c => c.CategoryId) //or whatever else you want to select 
    .SelectCount(c=> c.Products); 

別のオプションをすることができますそのカテゴリに関連付けられた製品の数を返すCategoryクラスの式propertyを定義します。

+0

「カテゴリ」は「ブランド」にリンクされていません。 'Brand'と' Categories'の間に直接のリンクはありません。ブランドには、そのブランドの製品を少なくとも1つ持つすべてのカテゴリがあります。その場合、単に製品の 'JoinQueryOver'を' InnerJoin'に変更すると、 –

+0

になります。 –

関連する問題