Sesión HTTP o enfoque de base de datos

16

Estoy un poco confundido sobre cuál debería ser mi enfoque, trabajando en un diseño de carrito de compras y necesito almacenar el carrito de compras ya sea en sesión o en la base de datos, pero no estoy seguro de qué enfoque sería el mejor.

  1. El usuario no está conectado y agrega producto al carrito (usuario anónimo)
  2. El usuario ha iniciado sesión y agrega producto al carrito.

El primer caso es más confuso para mí, ya que puede haber muchos casos en los que el usuario simplemente visita la tienda web y agrega productos sin iniciar sesión, y puede ser muy posible que no vaya a un proceso de pago.

Pero aún necesitamos crear un carrito de compras para este usuario, para crear y guardar el carrito de compras tengo dos opciones.

  1. Cuando el usuario agregue un producto, cree un carrito en la base de datos y asocie este carrito con este usuario, en el momento en que ingrese, mueva este carrito al usuario conectado.
  2. Cree el carrito, agregue el producto y guárdelo en la sesión, cuando el usuario haya iniciado sesión, cree el carrito en la base de datos y el usuario conectado asociado con este carrito con el usuario.

Sé que tanto el sistema de carrito basado en bases de datos como el basado en sesión pueden tener aspectos positivos y negativos, pero no estoy seguro de cuál podría ser el mejor enfoque para tener en cuenta los siguientes puntos

  1. Escalabilidad
  2. Flexibilidad
  3. Extensibilidad
  4. La aplicación debe cuidar la velocidad

Buscando aportes sobre este aspecto para decidir el camino.

Umesh Awasthi
fuente
2
¿Por qué? Ejecuto varios cientos de sitios web de comercio electrónico y almacenamos todo en cookies o localStorage (HTML5). Además, las sesiones usan memoria. Cuando iniciamos sesión en la cuenta, usamos una cookie cifrada con una marca de tiempo. No necesitamos una sesión porque cuando se carga una página, usamos técnicas HTML5 para almacenar y usar sessionStorage después de una sola carga. Esta es la tecnología web estándar compatible con IE8 +.
Jason Sebring
@LuiggiMendoza, ¿por qué no?
Jason Sebring
@ zipstory.com: también me gustaría echar un vistazo a la solución basada en HTML5, pero aún así, dado que no es compatible con pocos navegadores, dudo un poco
Umesh Awasthi
@UmeshAwasthi Supongo que a mis clientes no les importan las pocas personas en los navegadores inferiores, pero obviamente este es un mal enfoque si se trata de un caso diferente en su tráfico web. Sé que todavía gran parte del mundo usa XP en IE7 y, a veces, IE6, pero algunos de los productos de mis clientes se encuentran en tiendas como Nordstroms y Macy's, etc., y parece no estar preocupado por eso.
Jason Sebring
@ zipstory.com: estoy trabajando con una aplicación de comercio electrónico donde el cliente desea incluso soporte para IE6, ahora lo que dirás sobre él :)
Umesh Awasthi

Respuestas:

9

Buscaría una solución en la que se asigne una identificación única a todos los visitantes cuando accedan por primera vez al sitio. No importa si son anónimos o autenticados. Cuando los usuarios anónimos se registren, conserve la identificación única.

Almacene el carrito de compras en la base de datos. El almacenamiento es barato, y no debería ser un problema de rendimiento hacer una consulta del carro de vez en cuando.

Jakob Gade
fuente
¿Qué pasa cuando necesito mostrar la página de detalles del carrito? ¿Deberíamos almacenar / recuperar datos de la sesión o buscar un hit en la base de datos?
Umesh Awasthi
Si almacena los detalles del carrito en la base de datos, entonces sí, necesitaría acceder a la base de datos.
Jakob Gade
7

Ambos métodos tienen ventajas y desventajas, pero desde mi punto de vista, el almacenamiento de la base de datos tiene dos ventajas bastante grandes.

  1. Informes No puede informar sobre carritos abandonados, tasas de conversión, etc. si los datos están en la sesión.
  2. Tiempos de espera de sesión. Me molestaría que fuera a cenar y volviera a encontrar que mi carro estaba vacío porque la sesión había expirado. Me imagino que al minorista tampoco le gustaría eso. Queremos empujar al usuario para que compre, no para que se rinda y se vaya.
Jason P
fuente
6

La pregunta es asumir que necesita sesiones en absoluto que en mi mercado de clientes no es necesario. Ejecuto varios cientos de sitios web de comercio electrónico y un puñado de ellos está recibiendo mucho tráfico. No utilizamos sesiones nunca, ya que no son escalables a menos que sean cultivadas, entonces son más lentas o requieren más configuración. Las sesiones usan memoria y la recuperación de la base de datos del estado de la sesión es muy lenta y requiere más partes móviles.

En su lugar, usamos HTML5 sessionStorage para conservar cualquier información de usuario que necesitemos extraer una y otra vez, pero sin necesidad de un recorrido de cookies cada vez que aumente el ancho de banda. Este es IE8 + y todos los demás navegadores y dispositivos móviles modernos son compatibles con esta tecnología. PERO podría almacenar fácilmente el carrito en una cookie como reserva, ya que esto es lo que hicimos anteriormente. Aquí hay un buen carrito de galletas: http://simplecartjs.org/

Cuando los usuarios inician sesión o inician sesión, utilizamos una cookie cifrada con una marca de tiempo incorporada.

También nos estamos moviendo hacia el uso de ApplicationCache donde corresponda, lo que reducirá aún más el tráfico web como nota al margen, ya que puede captar recursos e incluso catalogar datos, por lo que la perspectiva del usuario será un sitio web de carga súper rápida y el móvil también funcionará sin conexión (menos transacciones). Por supuesto, debe tener cuidado de actualizar el manifiesto cuando los productos cambien, etc.

Jason Sebring
fuente
4

Asume que el almacenamiento de la sesión y el almacenamiento de la base de datos son exclusivos. No lo son Pero comencemos asumiendo que lo son.

La ventaja del almacenamiento de la sesión es triple:

  1. No es necesario insertar datos explícitamente en la base de datos. Simplemente configura una variable de sesión y listo. Simple y de bajo riesgo funcionalmente.
  2. No es necesario administrar el ciclo de vida de una visita del usuario y un carrito de compras, ya que los contenedores / marcos lo hacen por usted
  3. Por lo general, la limpieza automática de las viejas sesiones inactivas se realiza por usted.

Desventajas del almacenamiento de la sesión:

  1. Afinidad de sesión, a menos que investigue la replicación
  2. Sin conmutación por error, a menos que investigue la replicación o la persistencia manual del estado de la sesión en el disco, lo que puede complicarse.
  3. Todas las sesiones deben almacenarse en la memoria. Esto se amplifica si emplea la replicación.

Ventajas del almacenamiento de la base de datos:

  1. No necesita preocuparse por la afinidad de sesión o la replicación de estado. Puede hacer un round-robin de todas las solicitudes.
  2. Menos sobrecarga de memoria en la aplicación.
  3. Si se completa el pedido, todo termina en la base de datos de todos modos, por lo que esto podría facilitar la finalización porque los datos ya están presentes.

Desventajas del almacenamiento de la base de datos:

  1. Carros abandonados: un usuario anónimo agregó un artículo a su carrito de compras y desapareció. Esos datos permanecen para siempre a menos que tenga algún tipo de proceso de vencimiento.
  2. Debe encontrar una manera de rastrear a los usuarios y determinar si, para una solicitud determinada, esto representa una sesión de navegación nueva o existente. (sí, esto probablemente sea fácil si usa una cookie, pero ¿cómo se asegura de que dos usuarios no terminen con la misma identificación?).
  3. Más código

No mencionaste qué plataforma estás utilizando. Buscaría un enfoque que utilice una sesión respaldada por una base de datos en la que los datos de la sesión solo existan en la memoria durante la vida de un ciclo de solicitud / respuesta, cargándola de la base de datos y volviendo a guardarla en la base de datos. Esto me ha servido bien en el pasado.

Ventajas de una sesión respaldada por base de datos:

  1. No hay necesidad de afinidad de servidor.
  2. Fácil en la memoria del servidor de aplicaciones
  3. Los datos de sesión inactiva / abandonada se limpian por usted.
  4. El ciclo de vida de la primera visita del usuario, la visita repetida, el final de la sesión está todo resuelto para usted.
  5. Fácil de codificar

Desventajas de una sesión respaldada por base de datos:

  1. Configuración: debe investigar su contenedor, ya sea PHP, Java EE (Tomcat, Jetty, JBoss, etc.), node.js + express.js o cualquier otra cosa que no sea compatible con esto y proporcione la configuración correcta.
  2. Es posible que deba realizar una prueba de carga, ya que está agregando 2 operaciones de base de datos por solicitud.

Hay una tercera posibilidad, que alguien mencionó anteriormente. Puede omitir el uso de sesiones por completo y usar el almacenamiento del lado del cliente incrustando todo en una cookie o almacenamiento local html.

Dejaré los pros / contras de eso como un ejercicio para usted, pero le daré una pista de que para el almacenamiento html5, la compatibilidad del navegador puede ser algo que revise cuidadosamente.

He esbozado los hechos para ti. Esperemos que esto le ayude a tomar la decisión correcta para su situación.

Brandon
fuente
Se perdió una ventaja del almacenamiento de la base de datos, hábilmente de la organización para analizar las tasas de compra de las cosas colocadas en los carritos de compras.
HLGEM
@HLGEM Excelente idea, ¡nunca pensé en eso!
Brandon
Pienso en esto porque soy yo quien hace el análisis de los datos en la base de datos. Al diseñar bases de datos, una de las primeras preguntas debe ser para qué vamos a necesitar estos datos y casi nadie los pregunta.
HLGEM
3

Consideremos los dos casos de uso que ha mencionado

El usuario no está conectado y agrega producto al carrito (usuario anónimo)

En este caso, definitivamente desea guardar la información del carrito del usuario en una sesión para servir bien al usuario durante su sesión. Si él / ella decide iniciar sesión / crear una cuenta, puede manejar esto en función del próximo caso de uso. Si él / ella no inicia sesión, no es necesario que complete su base de datos con la información de este usuario invitado, ya que solo se utilizó para servir al invitado durante la sesión. Estos datos se pueden manejar sin estado, es decir, no se guarda el estado de una sesión a otra.

El usuario ha iniciado sesión y agrega producto al carrito.

En este caso, puede manejarlo de la misma manera que antes (sitios de comercio electrónico de la vieja escuela) y también agregar esta información a la base de datos y asociarla con el usuario. Esto se utiliza principalmente para proporcionar información con estado (estado guardado de una sesión a otra), como "Historial de navegación del producto", "Recomendaciones", etc., es decir, similar a Amazon.com.

Cosas para pensar:

  • ¿Es necesario guardar datos?
  • En caso afirmativo, ¿qué datos son más críticos para guardar para servir mejor al usuario?
  • Escalabilidad + almacenamiento de datos: ¿cómo guardará la información del carrito para una búsqueda rápida en su base de datos para admitir a muchos usuarios?
GeekByte
fuente
3
También ayuda a la empresa a analizar las ventas. Con qué frecuencia se coloca un producto en un carrito pero no se compra. Si el porcentaje es alto, es posible que quieran ver cómo se presenta el producto o el precio para ver si los cambios pueden ayudar a mejorar la tasa de compra. El ahorro también puede permitir al usuario ver esos artículos rápidamente si no los ordenó el día que los miró en lugar de buscarlos nuevamente. Así que tal vez los puso en su carrito pero quería esperar hasta mañana (día de pago) para comprarlos. Por lo tanto, guardar los datos puede hacer que sus clientes reales compren más cosas.
HLGEM
Pero al final, este es un problema de definición de requisitos y debe decirle a su empresa lo que planea hacer y asegurarse de que sea lo que esperan antes de construir cualquier cosa.
HLGEM
Recuerde que debe pensar en los pedidos y los carritos de compras desde la perspectiva de lo que la empresa podría necesitar para los datos en el futuro. Si quieren analizar datos, es mejor almacenarlos. Los desarrolladores se obsesionan con la interfaz de usuario y olvidan el propósito de los datos al ser almacenados al diseñar.
HLGEM
@HLGEM: ¡Muy buen punto! Respondí esta pregunta simplemente en función de la necesidad de soportar la funcionalidad del automóvil para un usuario invitado frente a un miembro del sitio. Desde el punto de vista comercial, debe haber un sistema de estadísticas separado que dependa de algún tipo de sistema de base de datos que rastree los productos en términos de geografía, # de usuarios, productos relacionados, compras versus descartes, etc.
GeekByte
0

Vaya a la sesión cuando el usuario no haya iniciado sesión. Incluso cuando haya iniciado sesión, cree primero el carrito en la sesión y guárdelo en la base de datos solo cuando el usuario cierre sesión o la sesión finalice.

Debe controlar el número de carros que se crean en la sesión.

Sudhanshu Umalkar
fuente