Estou lutando para normalizar um banco de dados onde há vários endereços pr. do utilizador.
A situação é que um usuário pode ter um endereço normal e um endereço de entrega. Quando um usuário faz um pedido, um dos endereços deve estar conectado ao pedido.
Estou tentando obter uma normalização 3NF. Então, armazenarei os endereços em uma tabela de junção. Devo adicionar uma chave primária à tabela user_addresses e usá-la na coluna fk_address_id na tabela de pedidos? ou isso seria quebrar o 3NF?
O que estou basicamente tentando fazer é possibilitar a realização de um pedido com um endereço diferente.
Considere algumas coisas:
Um pedido pode ser feito com um endereço personalizado, que não seja um dos endereços associados ao usuário? Por exemplo, quando um usuário encomenda um presente de Natal e solicita que ele seja enviado diretamente ao destinatário do presente. Nesse caso, não faça referência à
user_addresses
tabela. Isso limitaria os destinos de envio àqueles associados ao usuário.Os registros de endereço podem ser alterados após o pedido ser feito? Você precisa de um registro de onde um pedido foi enviado no momento? Se sim, então você precisa armazenar uma cópia dos detalhes do endereço, para preservar qual era o endereço naquela data. Pode parecer que isso entra em conflito com 3NF, mas está armazenando um fato diferente - o valor do endereço em um determinado momento, mesmo que seja atualizado posteriormente.
Livre-se de user_addresses; em vez disso, tenha um address_type (varchar) na tabela de endereços. Isso também elimina a tabela "address_types" supernormalizada.
Address_types podem ser "faturamento", "correio", "presente" (muitos). Faça com que a IU pergunte se o endereço de cobrança é igual ao endereço de correspondência, evitando assim alguma irritação ao usuário.
Como Bill aponta, um “envio para” pertence ao pedido, não ao usuário. (Enquanto isso, é possível seguir os links usuário <-> pedido <-> ship_to
Eu não me incomodaria em desduplicar seu endereço e o de seu parceiro.
Um professor está exigindo que você use 3NF? Se sim, não posso ajudá-lo.