Eu tenho o banco de dados para customers
. A customers
mesa é algo assim
+------------------+
| Customers |
+------------------+
| id (PK) |
| business_email |
| business_name |
| customer_name |
| payment_terms |
| currency |
| business_address |
| city |
| state |
| postal_code |
| country |
| phone |
| created_at |
| updated_at |
+------------------+
Agora quero colocar o endereço de entrega em meu aplicativo onde o cliente pode, opcionalmente, mencionar seu endereço de entrega shipping address
.
+------------------+
| Shipping Address |
+------------------+
| id (PK) |
| contact_name |
| contact_address |
| delivery_address |
| created_at |
| updated_at |
+------------------+
Agora, meu problema é que estou um pouco confuso sobre qual chave deve estar foreign key
em qual tabela. Estou impressionado com isso. Portanto, qualquer ajuda e sugestão serão altamente apreciáveis.
Supondo que uma empresa possa ter mais de um endereço de entrega, a chave seria uma coluna adicionada na tabela Endereço de entrega (apropriadamente chamada de 'customer_id' e a definição de chave estrangeira na tabela Endereço de entrega. Se você quiser evitar o mesmo endereço mais de uma vez, também adicione uma chave exclusiva na tabela de endereço de entrega que pode incluir (customer_id, contact_name)
Em uma nota não relacionada, certifique-se de que created_at e updated_at usem carimbos de data/hora;)
Talvez você queira adicionar um ID de cliente
Problemas que este design resolve:
O que acontece se um cliente se mudar - e um novo cliente usar o endereço antigo? Se você armazenar o customer_id no endereço, não saberá mais que o primeiro cliente usou esse endereço.
Por que um endereço deve ser um endereço de entrega? Um endereço é um endereço - o fato de você usá-lo como endereço de entrega é contextual para esse cliente, não um atributo adequado do próprio endereço. Usar um tipo de endereço na entidade Customer_X_Address permite que você veja, por exemplo, a diferença entre os endereços de cobrança e entrega de um cliente facilmente e armazene contatos mais apropriados para cobrança (contas a pagar) e recebimento (frete).
Cada remessa/transação poderia fazer referência à
customer_x_address
entidade de endereço e, talvez, várias vezes, uma para cobrança e outra para remessa. Nesse caso, provavelmente seria uma boa ideia adicionar uma chave substituta àcustomer_x_address
tabela.