2

警告

このデータベース構造に対して警告する免責事項を追加したかったのです。より合理化されたアプローチを強くお勧めします。

私の個人的な好みは、階層的な 1 つまたは 2 つのテーブル構造を使用してナビゲーション メニューを格納することです。フラットな構造からメニューを作成する方法については、https://stackoverflow.com/a/444303/1778606を参照してください。

答え

私の場合、答えはクライアントにメニューをキャッシュすることでした。必要に応じて読み進めてください。


いくつかのクエリを使用して生成される 3 層のメニューがあります。私が引き継いだアプリケーションには、多くのユーザー グループがあります。各ユーザーは、ユーザー グループを介して Web アプリケーションのさまざまなページ/部分にアクセスできます。1 人のユーザーが多くのユーザー グループに属する場合があります。

権限と利用可能なメニュー項目

メニューでは、各ユーザーは自分のグループがアクセスできるページのみを表示およびアクセスできる必要があります。すなわち。各ユーザーには、特定のメニュー項目、メニュー サブメニュー セクション、およびメニュー サブメニュー セクション項目のみが表示されます。ピボット テーブルは、可視性とアクセスを制御します。

メニューを生成するには、いくつかのクエリを作成する必要があります。私が提案するメニューデザインのサンプルを以下に示します。

メニューデザイン案

このメニューは、ユーザーがアクセスできる tier1、tier2、または tier3 アイテムによって大きく異なります。

ページの読み込みごとにメニューを生成するのではなく、ユーザーごとにセッション内のメニュー全体をキャッシュするのは適切でしょうか? これはキャッシュするデータが多すぎる可能性がありますか? 私の主な懸念は、セッション内のアクティブなユーザーごとに 3 つのテーブル (Tier1、Tier2、Tier3) をすべてキャッシュすることです。とにかくデータにアクセスして、ユーザーにアクセス許可があるかどうかを確認する必要がありますが、まあ!

メニューの生成に必要なクエリの数を減らすのに役立つアーキテクチャ設計はありますか? (この質問を書き始めたときに想定したように、ページの読み込みごとにメニューが通常どおりに生成されると仮定します)

この種のメニューはアプリケーションでは普通のことですか? 20 ほどのグループがあり、ユーザーは 2 人から 20 人すべてに属していますか? アドバイスやコメントは大歓迎です。

(ページの読み込みと処理時間を最小限に抑えたい。)

コンテキスト: 私は c#、asp.net mvc3、oracle を使用しています。推定最大ユーザー ベースは 20,000 人です。1000 に近い最大のアクティブ ユーザー ベース。おそらくアクティブ ユーザー ベースは 100 です。

4

4 に答える 4

2

最初にユーザーがログインすると、ログインしたユーザーの下で許可されたメニューがキャッシュに読み込まれます。次に、そのユーザーのキャッシュからメニュー/サブメニューにアクセスします。ユーザーがログアウトすると、キャッシュがクリアされます。このシナリオでは、新しいユーザーがログインするたびに、そのユーザーのキャッシュのみが読み込まれます。

ありがとう

于 2013-11-03T10:06:08.757 に答える
1

メニュー全体をユーザーごとに 1 回読み込み、クライアントにキャッシュします。

(リロードによって) キャッシュを無効にしない限り、リロードする必要はありません。

ユーザーがアクセス許可を持っていることを確認するために、各ページで引き続きクエリが必要になります。

(自分の質問に対する回答試行 #2)

于 2013-11-03T06:50:51.883 に答える
0

ここにオプションがあります...

Tier1、Tier2、Tier3 のデータ テーブルをアプリケーション データ キャッシュに保持する

各ユーザーのセッションで、Tier1、Tier2、Tier3 テーブルの主キーを配列に格納します。Tier1Key、Tier2Key、Tier3Key int[]。

これにより、メモリフットプリントがいくらか削減されます。まだ少し負荷が発生します。サブメニューの部分ビューを使用し、クライアントで部分ビューをキャッシュすることで、これを解決できる場合があります。(これには、MenuItem のクリック時に発生する ajax による遅延部分メニュー ロードが必要になります)

各ページへのアクセスを検証するためのクエリが必要になる場合があります。

クライアント キャッシングについては、OutputCache Location=Client が機能していないように見える を参照してください。

(私自身の質問に対する回答の試み)

于 2013-11-03T06:25:40.010 に答える