0

Zend Framework を使用して ERM アプリケーションを作成しています。このアプリケーションでは、ユーザー アカウントがメインの会社アカウントの下に作成され、会社が支払ったライセンスに基づいて会社のユーザー アカウント数を制限できます。各企業アカウントは、その企業に関連するデータを保存するために、サーバー上に独自のデータベース (他の企業と同じ構造) を持っています。各企業データベースの名前は、残りの企業アカウント情報とライセンス キーと共に「バック エンド」データベースに保存されます。認証システムは次のように機能します。

  1. 新しいユーザー (以前にアプリケーションを使用したことがない) がインデックス ページに到着すると、「会社のアカウント番号」の単一のテキスト フィールドが表示されます。
  2. [送信] をクリックした後、認証の次のステップはユーザー名とパスワードです。ユーザーがこのフォームを送信すると、3 つの情報 (アカウント番号、ユーザー名、およびパスワード) がすべてアプリケーションの認証ハンドラーに送信されます。
  3. 会社のアカウントを格納する「バックエンド」データベースは、ユーザーが入力したアカウントが存在するかどうかを確認するために最初に照会されます。存在する場合は、company_db_name列が返され、接続が確立されてから に保存されZend_Registryます。それ以外の場合、認証は失敗しました。
  4. 会社のアカウントが存在する場合、返されたデータベースはusers、指定されたユーザー名とパスワードのハッシュについてクエリされたテーブルを持ち、成功したインスタンスを返すMyApp_Authfalse、資格情報が正しくない場合に返します。

当初は、ユーザーのセッションデータを各社のデータベースに保存する予定でしたが、アプリケーションのインデックスページに最初にランディングしたときに、このデータベースに接続されていないという問題に遭遇しました。次のように回避策を計画しました。

  1. アプリケーションが起動するとすぐに、セッション ストレージ テーブルを顧客のデータベースから「バックエンド」データベースに移動します。
  2. テーブルに「会社口座番号」列を追加し、この列にインデックスを付けます。
  3. ユーザーがアプリケーションindexページに到達すると、バックエンド データベースに現在のユーザー エージェントのsessionid. 見つかった場合は、接続を確立するための会社のデータベース名や、モデルを構築するためのユーザー情報など、必要なすべての情報を返します。

このアプローチに関していくつか質問があります。

質問 1 : アプリケーションのすべてのユーザーのすべてのセッション情報を単一のバックエンド データベース テーブルに格納することにリスクはありますか? 私は数千ユーザーの考え方で考えています。

質問 2 : 新しいユーザーがインデックス ページにアクセスし、まったくの偶然 (これは非常に低い可能性ですが、可能性はあることを理解しています) で、バックエンド データベース内の既存のセッションと同じ session_id を持っているのではないかと心配しています。これは有効な懸念事項ですか? もしそうなら、それを軽減することはできますか?

質問 3: 必要な機能を実現するためのより良い方法はありますか、または別の方法をお勧めしますか?

お時間をいただきありがとうございます!

4

1 に答える 1

0

3つの質問に答えるには:

回答1.セッションの有効期限が切れたときに削除する限り、すべてのユーザーのセッション情報を保存すること自体にリスクはありません。ここでの問題は「スケーラビリティ」です。どのアプローチを使用していますか?十分にスケーラブルですか?書き込み/読み取り速度はどれくらいですか?MySQLは、MSSQLと同じように「構造化」されたアプローチです。あなたはどのような処理時間を探していますか?どのくらいの情報が保存されていますか?建築研究とは何ですか。それはあなたのクライアントにとって十分に実行可能ですか?

回答2.理想的には、session_idは同じではないので、心配する必要はありません。

回答3.NoSQL(SQLだけでなく、それ以上)のアプローチが必要です。これを読む

データの大規模さを見ると、 HBASE(Hadoopを使用、マルチクラスターに簡単)またはCouchDBを使用するか、AmazonファンのdynamoDBを使用することを強くお勧めします。

質問?:)

編集:ZendFrameworkを使用していることに気づきました。その場合は、MongoDBを使用したり、ShantyMongoライブラリを使用したりすることもできます。

于 2012-09-04T16:45:39.460 に答える