1

自分がデザインしているウェブサイト全体で何度も繰り返さなければならないパターンのデザインソリューションを探しています。これはASP.NETMVCフロントエンドになり、C#WCFWebサービスがNHibernateを使用してSQLデータベースに接続します。

これはソーシャルネットワーキングサイトなので、ここでFacebookを想像して概念的なアイデアを入手してください。私が探しているのは、大規模なデータセットのページ化された結果を返すための効率的でパフォーマンスの高い方法です。たとえば、ユーザーが150通の電子メールを持っている場合があります。表示されているページに応じて一度に10個を返したいのですが、ユーザーエクスペリエンスのように、150個のアイテムすべてをメモリにロードして、一度に10個だけを表示するのではなく、明らかにページに関連する10個だけを返します。初期読み込みを高速化する場合と比較して、ページ変更の遅延を少し長くすることをお勧めします。結局のところ、6か月前のメールはいつ見ますか?通常のケースでは、とにかく結果の最初のページだけを気にします。同様に、ユーザーは最後のログイン以降に多くのインタラクションを経験している可能性があります(たとえば、Facebookの通知フィード)が、一度にn個の結果のみをロードしたいのですが、この場合、ページを表示するのではなく、 [さらに表示]ボタンをクリックすると、次のN個の結果が取得され、別の[さらに表示]リンクで表示されます。データセットの最後に到達するまでクリックし続けることができます。技術的には両方ともページ化された結果であり、UI出力とフローが異なるだけなので、どちらも同じデザインを使用すると想像できます。リンクなどは、データセットの最後に到達するまでクリックし続けることができます。技術的には両方ともページ化された結果であり、UI出力とフローが異なるだけなので、どちらも同じデザインを使用すると想像できます。リンクなどは、データセットの最後に到達するまでクリックし続けることができます。技術的には両方ともページ化された結果であり、UI出力とフローが異なるだけなので、どちらも同じデザインを使用すると想像できます。

私のデータ検索がNHibernateQueryableまたはEnumerablesを使用していることを念頭に置いて、誰かがこれに使用するための優れた設計についてアドバイスを提供できますか?DBからすべてのデータを1回のヒットでロードし、インターレーターパターンを使用して、サービスレイヤーからN行のみを返し、サーバー上のメモリに保持されている残りのリストをユーザーセッションコンテキストで開いたままにします。次のN行を取得する別の呼び出しでは、その場所に保持され、イテレータが終了するまでN行を返し続けます。または、データベースからN行を取得して、セッションコンテキストで何も保持せずに、それらを返すのが最善でしょうか。Queryableから上位10件の結果を返す方法を次のように確認できます。

var results = (from email in emails where email.UserId = userId).Take(10);

しかし、これがどれほど効率的かはわかりませんが、これが最速の方法ですか?さらに、特定の位置から開始する方法がわかりません。これは常に最初の10のみを返し、2番目の10、3番目の10などは返しません。

ですから、私は先に進むための最善の方法がどのようにあるのか少しわかりません。そして、似たようなことをした人々からのいくつかの指針とアドバイスを期待していました。私のウェブサイトのパフォーマンスを念頭に置くことが重要になるので、ユーザーエクスペリエンスは非常にシャープでインタラクティブで、新しい結果を更新する必要があります。基本的に、Facebookのニュースフィード/ウォールをシミュレートしようとした場合、上記のアーキテクチャでどのように実装しますか?

ありがとう!

4

3 に答える 3

4

Skip次のものと組み合わせて使用​​できますTake

var results = (from email in emails where email.UserId = userId)
              .Skip((currentPage - 1) * 10)
              .Take(10);

Web サービスについて: 本当にステートレスな Web サービスにする必要があります。これには ASP.NET Web API を使用できます。これにより、RESTful Web サービスを構築できます。

于 2012-11-23T12:22:21.067 に答える
2

1 回のヒットですべてをロードしたいですか...

間違いなく、必要なレコードではなく、必要なレコードのみを取得する必要あります。

...インターレーター パターンを使用して、サービス レイヤーから N 行のみを返し、残りのリストをサーバー上のメモリに保持し、ユーザー セッション コンテキストで開いたままにします...

スケーラビリティは、そのアイデアですぐに実現します。

...または、単純にデータベースから N 行を取得してそれらを返し、セッション コンテキストに何も保持しないのが最善でしょうか?

今、あなたは正しい軌道に乗り始めています...

一般に、データベースにできるだけ多くのクエリを実行させたいと考えています。つまり、データベースにアクセスして結果をさらにクエリする必要はありません (ただし、常に回避できるとは限りません)。つまり、すべてではないにしても、大部分の重労働をデータベースに委譲する必要があります。

あなたは非常に強力な ORM である NHibernate を使用していると述べました。良いニュースは、クエリの最適化/データのキャッシュなどに関して多くの作業を行うことです。最近のほとんどの ORM と同様に、NHibernate はクエリで遅延実行を使用するため、データベースへのアクセスが早すぎたり、いつ選択するかなどに注意してください。複数のクエリを実行する代わりに、データを熱心にロードします。NHibernate について学ぶことはたくさんあります。まだ読んでいない場合は、長期的には多くの手間を省くことができるように、それに飛び込む前に時間を取って読む価値があります。

私のウェブサイトのパフォーマンスが重要になることを念頭に置いて、ユーザーエクスペリエンスは非常にシャープでインタラクティブで、新しい結果を更新する必要があります

パフォーマンス (ページの読み込み速度を意味すると思います) に関しては、サイトを ajaxify したいだけです。つまり、ページと共に読み込む必要があるものを読み込み、残りをバックグラウンドでプルして、ページを動的に更新します。「新しい結果の更新」の部分を達成するには、サーバーのポーリングと新しいデータの取得を検討する必要があります。Facebookがロングポーリングと呼ばれる手法を使用していると確信していますこれは基本的に、サーバーでアクティブなリクエストを一定時間開いたままにするため、データが「即座に」発生したように見えます。ポーリングはまったく別の球技ですが、サーバーの負荷とデータがどれだけ「新鮮」である必要があるかのバランスをとることが重要です。これは自分で決める必要があり、その答えは通常、データの種類に依存します。対サーバーのハードウェア機能。

于 2012-11-23T12:54:02.847 に答える
0

それについてのいくつかのリンク (このような) がありますが、私はこの男のアプローチが好きでした。彼の PagedQueryable を使用するかどうかはわかりませんが、彼のIPageableIPagedEnumerable、およびPagedEnumerableは非常に興味深いものです。また、彼のプロジェクト紹介ページでは、独自のページネーションを展開する方法についていくつかのアイデアが得られるかもしれません。

于 2012-11-23T14:58:35.580 に答える