web-dev-qa-db-ja.com

HTTPセッションまたはデータベースアプローチ

私のアプローチはどうあるべきか少し混乱しています。ショッピングカートのデザインに取り組み、ショッピングカートをセッションまたはデータベースのいずれかに保存する必要がありますが、どちらのアプローチが最適であるかはわかりません。

  1. ユーザーがログインしておらず、商品をカートに追加していない(匿名ユーザー)
  2. ユーザーはログインしており、商品をカートに追加しています。

ユーザーがログインせずにWebショップにアクセスして製品を追加するだけのケースが多く、チェックアウトプロセスに行かなくなる可能性が非常に高いため、最初のケースは私にとってより混乱します。

ただし、このユーザーのショッピングカートを作成する必要があります。ショッピングカートを作成して保存するには、2つのオプションがあります。

  1. ユーザーが製品を追加するときに、データベースにカートを作成し、このカートをこのユーザーに関連付けます。ログインした瞬間に、このカートをログインしたユーザーに移動します。
  2. カートを作成し、それに製品を追加してセッションに保存します。ユーザーがログインすると、データベースにカートが作成され、ログインしたユーザーとこのカートにユーザーが関連付けられます。

データベース駆動のカートシステムとセッションベースのどちらにも、良い面と悪い面がある可能性があることは知っていますが、以下の点を考慮に入れる場合、どちらが最善のアプローチであるかはわかりません

  1. スケーラビリティ
  2. 柔軟性
  3. 拡張性
  4. アプリケーションは速度に注意する必要があります

パスを決定するためにこの側面に関する入力を探しています。

16
Umesh Awasthi

最初にサイトにアクセスしたときにすべての訪問者に一意のIDが割り当てられるソリューションを探します。匿名であるか認証されているかは関係ありません。匿名ユーザーが登録するときに、一意のIDを保持します。

ショッピングカートをデータベースに保存します。ストレージは安価であり、カートのクエリを時々実行することはパフォーマンス面で問題になりません。

9
Jakob Gade

どちらの方法にも長所と短所がありますが、私の考えでは、データベースストレージには2つのかなり大きな利点があります。

  1. 報告。セッション中にデータが存在する場合、放棄されたカート、コンバージョン率などについてレポートすることはできません。
  2. セッションタイムアウト。セッションが終了したため、夕食を食べに行ってカートが空になっているのを見つけに戻ってきたら、私はイライラします。小売業者もそれを気に入らないと思います。ユーザーをあきらめたり離したりするのではなく、購入の方向に向けます。
7
Jason P

問題は、私のクライアントの市場では必要のないセッションがまったく必要だと想定していることです。私はたまたま数百のeコマースWebサイトを運営しており、そのうちのいくつかは高いトラフィックを得ています。ファームアウトされない限りスケーラブルではないため、セッションが遅くなるか、セットアップがさらに必要になるため、セッションは使用しません。セッションはメモリを使い果たし、データベースのセッション状態のフェッチは非常に遅く、より多くの可動部分が必要です。

代わりに、HTML5 sessionStorageを使用して、何度もプルする必要があるすべてのユーザー情報を永続化しますが、帯域幅を増やすために毎回Cookieを巡回させる必要はありません。これはIE8 +であり、他のすべての最新のブラウザーおよびモバイルデバイスはこの技術と互換性があります。ただし、これは以前に行った方法なので、フォールバックとしてカートをCookieに簡単に保存できます。これが良いcookie-cartです: http://simplecartjs.org/

ユーザーがログインまたはログインするときは、タイムスタンプが組み込まれた暗号化されたCookieを使用します。

リソースとカタログデータさえプリフェッチできるため、アプリケーションキャッシュを適用して、Webトラフィックをサイドノートとしてさらに削減します。これにより、ユーザーの視点は超高速のロードWebサイトとなり、モバイルもオフラインで動作します(トランザクションはマイナスになります)。もちろん、製品が変更されたときなど、マニフェストを更新するように注意する必要があります。

6
Jason Sebring

セッションストレージとデータベースストレージは排他的であると想定しています。そうではありません。しかし、それらがそうであると仮定することから始めましょう。

セッションストレージの利点は3つあります。

  1. データベースにデータを明示的に挿入する必要はありません。セッション変数を設定するだけで完了です。機能的にシンプルで低リスク。
  2. コンテナ/フレームワークがあなたのためにそれを行うので、ユーザーの訪問とショッピングカートのライフサイクルを管理する必要はありません
  3. 通常、古いアイドルセッションの自動クリーンアップが行われます。

セッションストレージの欠点:

  1. レプリケーションを調査しない限り、セッションアフィニティ
  2. レプリケーションまたはセッション状態のディスクへの手動の永続化を調査しない限り、フェイルオーバーはありません。
  3. すべてのセッションはメモリに保存する必要があります。レプリケーションを採用すると、これは増幅されます。

データベースストレージの利点:

  1. セッションアフィニティや状態のレプリケーションについて心配する必要はありません。すべてのリクエストをラウンドロビンすることができます。
  2. アプリケーションのメモリオーバーヘッドが少ない。
  3. 注文が完了すると、すべてがとにかくデータベースに入れられるため、データが既に存在するため、これにより完了が容易になる可能性があります。

データベースストレージの欠点:

  1. 放棄されたカート-一部の匿名ユーザーがショッピングカートにアイテムを追加して姿を消しました。何らかの有効期限プロセスがない限り、そのデータは永久に残ります。
  2. ユーザーを追跡し、特定のリクエストに対して、これが既存または新しいブラウジングセッションを表すかどうかを把握する方法を考え出す必要があります。 (はい、これはCookieを使用する場合はおそらく簡単ですが、2人のユーザーが同じIDにならないようにするにはどうすればよいですか?).
  3. その他のコード

使用しているプラ​​ットフォームについては言及していません。私は、要求/応答サイクルの存続期間中、セッションデータがメモリにのみ存在し、それをデータベースからロードしてデータベースに保存し直す、データベースに基づくセッションを使用するアプローチを模索します。これは過去によく役立ちました。

データベースを使用するセッションの利点:

  1. サーバーアフィニティは必要ありません。
  2. アプリサーバーのメモリで簡単
  3. アイドル/放棄されたセッションデータがクリーンアップされます。
  4. ユーザーの最初の訪問、再訪問、セッション終了のライフサイクルはすべてあなたのために理解されています。
  5. コーディングが簡単

データベースを使用するセッションの欠点:

  1. 設定-コンテナを調査する必要があります。それがPHP、Java EE(Tomcat、Jetty、JBossなど))、node.js + express.js、またはこれをサポートしていないものであるかどうか、そして権利を提供する必要があります構成。
  2. リクエストごとに2つのデータベース操作を追加するため、これをロードテストする必要がある場合があります。

3番目の可能性があり、誰かが以前に触れました。すべてをCookieまたはhtmlローカルストレージに埋め込むことで、セッションの使用をすべてスキップし、クライアント側のストレージを使用できます。

その長所と短所は演習として残しておきますが、html5ストレージの場合、ブラウザーの互換性を注意深く検討する必要があるかもしれないというヒントをお伝えします。

事実の概要を説明しました。うまくいけば、これはあなたがあなたの状況に適切な決定をするのに役立ちます。

4
Brandon

あなたが言及した2つのユースケースを考えてみましょう

ユーザーがログインしておらず、商品をカートに追加していない(匿名ユーザー)

この場合、ユーザーのカート情報をセッションに保存して、セッション中にユーザーに適切にサービスを提供する必要があります。ログイン/アカウントの作成を決定した場合は、次のユースケースに基づいてこれを処理できます。ログインしない場合、データベースはセッション中にゲストにサービスを提供するためにのみ使用されていたため、このゲストユーザーの情報をデータベースに入力する必要はありません。このデータはステートレスベースで処理できます。つまり、セッション間で状態が保存されません。

ユーザーはログインしており、商品をカートに追加しています。

この場合、上記と同じ方法(古い学校のeコマースサイト)で処理し、この情報をデータベースに追加して、ユーザーに関連付けることができます。これは主に、「製品の閲覧履歴」、「推奨事項」など、Amazon.comと同様のステートフル(セッション間で保存された状態)情報を提供するために使用されます。

考慮すべき事柄:

  • データを保存する必要はありますか?
  • はいの場合、ユーザーにより良いサービスを提供するために保存する必要があるデータはどれですか。
  • スケーラビリティ+データストレージ-多くのユーザーをサポートするために、データベース内の高速ルックアップ用のカート情報をどのように保存しますか?
3
GeekByte

ユーザーがログインしていないときにセッションに移動します。ログインしている場合でも、最初にセッションでカートを作成し、ユーザーがログアウトするかセッションがタイムアウトしたときにのみ、カートをデータベースに保持します。

セッションで作成されるカートの数をチェックする必要があります。

0