警告
このデータベース構造に対して警告する免責事項を追加したかったのです。より合理化されたアプローチを強くお勧めします。
私の個人的な好みは、階層的な 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 です。