Abordagem de sessão HTTP ou banco de dados

16

Estou confuso um pouco sobre qual deve ser minha abordagem, Trabalhando em um design de carrinho de compras e preciso armazenar o carrinho de compras na sessão ou no banco de dados, mas não tenho certeza de qual abordagem seria melhor.

  1. O usuário não está logado e adicionando o produto ao carrinho (usuário anônimo)
  2. O usuário está logado e adicionando o produto ao carrinho.

O primeiro caso é mais confuso para mim, pois pode haver muitos casos em que o usuário apenas visita a loja virtual e adiciona produto sem fazer login e pode ser bem possível que ele não esteja indo para um processo de checkout.

Mas ainda precisamos criar um carrinho de compras para esse usuário. Para criar e salvar o carrinho de compras, tenho duas opções.

  1. Ao adicionar um produto ao usuário, crie um carrinho no banco de dados e associe esse carrinho a esse usuário. No momento em que ele estiver conectado, mova esse carrinho para o usuário conectado.
  2. Crie carrinho, adicione produto a ele e salve-o na sessão, quando o usuário conectado criar carrinho no banco de dados e associado usuário conectado a este carrinho com usuário.

Eu sei que tanto o sistema de carrinho orientado por banco de dados quanto a sessão podem ter aspectos positivos e negativos, mas não tenho certeza de qual pode ser a melhor abordagem para levar em conta os seguintes

  1. Escalabilidade
  2. Flexibilidade
  3. Extensibilidade
  4. Aplicação Deve cuidar da velocidade

Procurando informações sobre esse aspecto para decidir o caminho.

Umesh Awasthi
fonte
2
Por quê? Eu administro várias centenas de sites de comércio eletrônico e armazenamos tudo em cookies ou em LocalStorage (HTML5). Além disso, as sessões consomem memória. Quando fazemos login na conta, usamos um cookie criptografado com um carimbo de data e hora. Não precisamos de uma sessão porque, quando uma página é carregada, usamos técnicas HTML5 para armazenar e usar o sessionStorage após um único carregamento. Esta é a tecnologia da Web padrão compatível com IE8 +.
Jason Sebring
@LuiggiMendoza ok porque não.
precisa
@ zipstory.com: Eu também gostaria de ter um olhar sobre a solução HTML5 baseado, mas ainda desde a sua não é suportado por alguns navegador, eu sou pouco duvidoso
Umesh Awasthi
@UmeshAwasthi Suponho que meus clientes não se importam com o número reduzido de pessoas em navegadores inferiores, mas obviamente essa é uma péssima abordagem se for um caso diferente no tráfego da web. Sei que grande parte do mundo usa XP no IE7 e, às vezes, no IE6, mas alguns de meus clientes são encontrados em lojas como Nordstroms e Macy's, etc., e parecem não se preocupar com isso.
Jason Sebring
@ zipstory.com: Eu estou trabalhando com um aplicativo de comércio eletrônico onde o cliente quer apoio, mesmo para o IE6, agora o que você vai dizer abt-lo :)
Umesh Awasthi

Respostas:

9

Eu buscaria uma solução em que um ID exclusivo seja atribuído a todos os visitantes quando eles acessarem o site. Não importa se eles são anônimos ou autenticados. Quando usuários anônimos se registram, mantenha o ID exclusivo.

Armazene o carrinho de compras no banco de dados. O armazenamento é barato e não deve ser um problema em termos de desempenho fazer uma consulta para o carrinho de vez em quando.

Jakob Gade
fonte
e quando eu preciso mostrar a página de detalhes do carrinho? devemos armazenar / buscar dados da sessão ou acessar um banco de dados?
Umesh Awasthi
Se você armazenar os detalhes do carrinho no banco de dados, sim, será necessário acessar o banco de dados.
Jakob Gade
7

Ambos os métodos têm vantagens e desvantagens, mas, a meu ver, o armazenamento de banco de dados tem duas vantagens bastante grandes.

  1. Comunicando. Você não pode relatar carrinhos abandonados, taxas de conversão etc. se os dados estiverem na sessão.
  2. Tempo limite da sessão. Eu ficaria irritado se eu fosse jantar e voltasse para descobrir que meu carrinho estava vazio porque a sessão expirou. Eu imaginaria que o varejista também não gostaria disso. Queremos levar o usuário a comprar, não desistir e sair.
Jason P
fonte
6

A questão é supor que você precise de sessões que no meu mercado de clientes não sejam necessárias. Por acaso, eu tenho várias centenas de sites de comércio eletrônico e alguns deles estão recebendo muito tráfego. Nós nunca usamos sessões porque elas não são escalonáveis, a menos que sejam criadas, pois são mais lentas ou requerem mais configuração. As sessões usam a memória e a busca do banco de dados do estado da sessão é muito lenta e requer mais partes móveis.

Em vez disso, usamos o HTML5 sessionStorage para persistir todas as informações do usuário que precisamos extrair repetidamente, mas sem a necessidade de uma nova viagem de cookies a cada vez para aumentar a largura de banda. Este é o IE8 + e todos os outros navegadores e dispositivos móveis modernos são compatíveis com esta tecnologia. MAS você pode facilmente armazenar o carrinho em um cookie como substituto, pois foi o que fizemos anteriormente. Aqui está um bom carrinho de biscoitos: http://simplecartjs.org/

Quando os usuários fazem login ou login, usamos um cookie criptografado com um carimbo de data / hora.

Também estamos avançando no uso do ApplicationCache, quando aplicável, o que reduzirá ainda mais o tráfego da Web como uma observação lateral, pois você pode buscar recursos e até catalogar dados para que a perspectiva do usuário seja um site de carregamento super rápido e o celular também funcione offline (menos transações). É claro que você deve ter cuidado para atualizar o manifesto quando os produtos mudarem etc.

Jason Sebring
fonte
4

Você está assumindo que o armazenamento da sessão e o armazenamento do banco de dados são exclusivos. Eles não são. Mas vamos começar assumindo que são.

A vantagem do armazenamento da sessão é três vezes:

  1. Não há necessidade de inserir dados explicitamente no banco de dados. Você simplesmente define uma variável de sessão e pronto. Funcionalidade simples e de baixo risco.
  2. Não há necessidade de gerenciar o ciclo de vida de uma visita do usuário e carrinho de compras, pois os contêineres / estruturas fazem isso por você
  3. Normalmente, a limpeza automática de sessões ociosas antigas é feita para você.

Desvantagens do armazenamento da sessão:

  1. Afinidade de sessão, a menos que você investigue a replicação
  2. Sem failover, a menos que você investigue a replicação ou persistência manual do estado da sessão no disco, o que pode ser complicado.
  3. Todas as sessões devem ser armazenadas na memória. Isso é amplificado se você empregar replicação.

Vantagens do armazenamento de banco de dados:

  1. Não é necessário se preocupar com a afinidade da sessão ou a replicação de estado. Você pode alternar entre todas as solicitações.
  2. Menos sobrecarga de memória no aplicativo.
  3. Se o pedido for concluído, tudo acaba no banco de dados de qualquer maneira, para facilitar a conclusão, porque os dados já estão presentes.

Desvantagens do armazenamento do banco de dados:

  1. Carrinhos abandonados - algum usuário anônimo adicionou um item ao carrinho de compras e desapareceu. Esses dados permanecem permanentemente, a menos que você tenha algum tipo de processo de expiração.
  2. Você precisa encontrar uma maneira de rastrear usuários e descobrir se, para uma determinada solicitação, isso representa uma sessão de navegação nova ou existente. (sim, isso provavelmente é fácil se você usar um cookie, mas como garantir que dois usuários não terminem com o mesmo ID?).
  3. Mais código

Você não mencionou qual plataforma está usando. Eu procuraria uma abordagem que use uma sessão baseada em banco de dados em que os dados da sessão só existam na memória durante a vida de um ciclo de solicitação / resposta, carregando-os no banco de dados e salvando-os novamente no banco de dados. Isso me serviu bem no passado.

Vantagens de uma sessão baseada em banco de dados:

  1. Não há necessidade de afinidade do servidor.
  2. Fácil na memória do servidor de aplicativos
  3. Os dados da sessão ociosa / abandonada são limpos para você.
  4. O ciclo de vida da primeira visita do usuário, visita repetida e final da sessão está tudo planejado para você.
  5. Fácil de codificar

Desvantagens de uma sessão suportada por banco de dados:

  1. Configuração - você precisa investigar seu contêiner, seja PHP, Java EE (Tomcat, Jetty, JBoss, etc.), node.js + express.js ou outros tipos de suporte a isso e forneça a configuração correta.
  2. Pode ser necessário carregar o teste, pois você está adicionando duas operações de banco de dados por solicitação.

Há uma terceira possibilidade, na qual alguém abordou anteriormente. Você pode ignorar completamente o uso de sessões e usar o armazenamento do lado do cliente incorporando tudo em um cookie ou em um armazenamento local html.

Deixarei os prós / contras disso como um exercício para você, mas darei uma dica de que, para o armazenamento html5, a compatibilidade do navegador pode ser algo a ser analisado cuidadosamente.

Eu descrevi os fatos para você. Espero que isso ajude você a tomar a decisão certa para sua situação.

Brandon
fonte
Você perdeu uma vantagem do armazenamento de banco de dados, habilmente da organização para analisar as taxas de compra de itens colocados em carrinhos de compras.
HLGEM
@HLGEM Excelente ideia - nunca pensei nisso!
Brandon
Penso nessas coisas porque sou eu quem faz a análise dos dados no banco de dados. Ao projetar bancos de dados, uma das primeiras perguntas deve ser para o que precisamos desses dados e quase ninguém as pergunta.
HLGEM
3

Vamos considerar os dois casos de uso que você mencionou

O usuário não está logado e adicionando o produto ao carrinho (usuário anônimo)

Nesse caso, você definitivamente deseja salvar as informações do carrinho do usuário em uma sessão para atender bem ao usuário durante sua sessão. Se ele / ela decidir fazer login / criar uma conta, você pode lidar com isso com base no próximo caso de uso. Se ele / ela não efetuar login, você não precisará preencher seu banco de dados com as informações deste usuário convidado, pois elas foram usadas apenas para servir o convidado durante a sessão. Esses dados podem ser manipulados sem estado, ou seja, o estado não é salvo de uma sessão para outra.

O usuário está logado e adicionando o produto ao carrinho.

Nesse caso, você pode lidar com isso da mesma maneira que acima (sites de comércio eletrônico da velha escola) e também adicionar essas informações ao banco de dados e associá-las ao usuário. Isso é usado principalmente para fornecer informações de estado (estado salvo de sessão para sessão), como "Histórico de navegação do produto", "Recomendações" etc., por exemplo, semelhante ao Amazon.com.

Coisas para pensar:

  • É necessário salvar dados?
  • Em caso afirmativo, quais dados são mais críticos para serem salvos para melhor servir o usuário?
  • Escalabilidade + armazenamento de dados - Como você salva as informações do carrinho para uma rápida pesquisa no seu banco de dados para dar suporte a muitos usuários?
GeekByte
fonte
3
Também ajuda a empresa a analisar as vendas. Com que frequência um produto é colocado em um carrinho, mas não é comprado. Se a porcentagem for alta, eles podem querer ver como o produto é apresentado ou o preço, para ver se as mudanças podem ajudar a melhorar a taxa de compra. A economia também pode permitir que o usuário veja esses itens rapidamente, se ele não os encomendou no dia em que procurou, em vez de procurá-los novamente. Então, talvez você os coloque no carrinho, mas queira esperar até amanhã (dia do pagamento) para comprá-los. Portanto, salvar os dados pode resultar em seus clientes reais comprando mais coisas.
HLGEM
No final, porém, esse é um problema de definição de requisitos e você deve informar à sua empresa o que planeja fazer e garantir que é o que eles esperam antes de criar qualquer coisa.
HLGEM
Lembre-se de que você precisa pensar em pedidos e carrinhos de compras da perspectiva do que a empresa pode precisar dos dados para o futuro. Se eles querem analisar dados, é melhor armazená-los. Os desenvolvedores ficam desconectados da interface do usuário e esquecem o propósito dos dados em serem armazenados ao projetar.
HLGEM
@HLGEM: Muito bom ponto! Respondi a essa pergunta apenas com base na necessidade de oferecer suporte à funcionalidade do carro para um usuário convidado versus um membro do site. Do ponto de vista comercial, deve haver um sistema estatístico separado que depende de algum tipo de sistema de banco de dados que rastreie produtos em termos de geografia, número de usuários, produtos relacionados, compra versus devoluções etc.
GeekByte
0

Vá para a sessão quando o usuário não estiver logado. Mesmo quando logado, crie o carrinho na sessão primeiro e persista no banco de dados somente quando o usuário efetuar logout ou o tempo limite da sessão expirar.

Você precisa verificar o número de carrinhos criados na sessão.

Sudhanshu Umalkar
fonte