Depende dos seus objetivos para o seu carrinho. Por exemplo, você deseja permitir compras de convidados? ou seja, onde um usuário não precisa fazer login para fazer uma compra?
A imagem anexada é um design que tenho trabalhado e é assim:
-
Um visitante seleciona produtos do site e os adiciona a um carrinho de sessão (apenas um local para armazenar temporariamente os produtos, suas quantidades e seus preços etc.)
-
Quando o cliente estiver pronto para fazer o check-out, criamos o pedido, a pessoa do pedido e o person_address (onde o produto deve ser entregue) e adicionamos os itens à tabela order_item. Todas essas informações são adicionadas pelo cliente na página de checkout.
-
O passo final é então oferecer os métodos de pagamento:paypal, cartão de crédito, etc.
O que eu gosto neste design é que os usuários não têm obrigação de se registrar conosco. Order_person atua como uma espécie de interface entre usuários e pedidos. Se nos registrarmos, simplesmente vinculamos order_person à tabela de usuários...
Também incluí um exemplo de front-end da página de checkout.