2012-03-20 20 views
0

私は、ユーザーが電話会議をスケジュールし、自分のメールアドレスを使用して人を招待できるシステムを持っています。これは、EntityFrameworkをリポジトリパターンで使用してASP.net MVC 3で実装されています。ユーザーがログインしているときに、自分が作成した、または招待された予定のコールのリストを表示するとします。このリストには、通話の詳細とオーガナイザーの名前/電子メールアドレスが表示され、オーガナイザーには、通話作成者の[ユーザー名]フィールドと[プロファイル]フィールドが保存されます。プロフィールデータの使用を最適化する

オーガナイザーがログオンしているユーザーの場合、これはうまくいきますが、別のユーザーがコールを編成したときに、UserIdによってユーザーを取得しています(呼び出しに対して保存されているため)。その名前と電子メールへのリンク - スケジュールされたコールが多数ある場合、または履歴コールのリストを追加すると、データベースのクエリが相当に多くなり、最適ではないと感じることがあります。私が検討している

2のアプローチは、以下のとおりです。コールが作成されたとき

  1. は、主催者の名前と電子メールを保管してください。これらの詳細は後で主催者によって更新される可能性がありますが、誤った連絡先情報が表示される可能性があります。
  2. ロードハッシュテーブルにすべてのユーザーの詳細や、このたびの照会 - システムは、それは初期の頃だ現在で、少数のユーザーが、しかし、で終わる可能性があり、数千

別のアプローチがあります(最大で)どちらが最適な方法でこれを解決できるかは考えていませんか?

+0

プロファイル情報をコールに参加/含めると、それで十分ではありませんか? –

+0

私のクエリでエンティティに参加していない.netメンバーシッププロバイダを使用しています。これを行う方法がある場合は素晴らしい? – Macros

+0

OK、そうです。いいえ、これを行うエレガントな方法ではありません。 [this](http://blogs.teamb.com/craigstuntz/2010/03/05/38558/)を参照してください。 –

答えて

1

ユーザーのプロファイル(インメモリ[System.Web.Caching/System.Runtime.Caching]またはより洗練されたキャッシュ)をキャッシュし、一部のユーザーのプロファイルが変更されたときに無効にすることができます。

もちろん、キャッシュ全体ではなく、変更されたユーザーのレコードのみを無効にします。

このように、両方の世界を楽しむことができます - プロフィールの詳細のためにデータベースの代わりにメモリに当たって、一部のユーザーがプロフィールを変更した場合でも最新のデータを保持します。

+0

ありがとうございます - あなたは例がありますか?私はapplication_startでこれをやっていますか、それともセッション/ユーザ・バスをしていますか? – Macros

+0

残念ながら、この範囲をはるかに超えてコードサンプルを提出しようとしています。基本的には、アプリケーション開始時や他のアプリケーション全体の場所ではなく、ユーザーベースのプロファイル(ユーザーがプロファイルを変更したときの実際のユーザーアクティビティに基づく)である必要があります。あなたのリポジトリで、ユーザーのプロファイルを取得しようとするときは、最初にキャッシュ内にあるかどうかをチェックします。もしそうなら、それを提供する。そうでない場合は、DBに行き、キャッシュに保存して、結果を返します。ユーザーがプロフィールを変更すると、キャッシュエントリが無効になります(削除または更新されます)。 –

+0

私がキャッシュするデータは事実上、キーとしてGuidと値として文字列(または2文字列)を持つハッシュテーブルです。このアプローチは本当にそれに適していますか?過剰殺人のように思える。 – Macros

関連する問題