Na minha opinião você está tornando isso muito complexo. Não há necessidade de tornar seu esquema de endereço tão normalizado. A maioria dos sistemas que vi que lidam com vários endereços de clientes têm uma tabela de clientes como a sua e, em seguida, uma tabela de endereços, da seguinte forma:
customer_id
address_ordinal (small number for each customer: 0,1,2,3 etc).
primary (boolean)
address_1
address_2
locality (city, village, etc)
province (state, etc)
postcode (zip, postcode etc)
country
customer_id
é uma chave estrangeira para o customer
tabela. A chave primária é um composto de (customer_id
, address_ordinal
). O primary
coluna é true
se o endereço for o principal. Em relação à sua pergunta sobre fornecedores, convém criar uma tabela comum chamada "contatos" e fornecer a seus clientes e fornecedores contact_ids.
Se o seu sistema contiver uma tabela de referência (talvez algo que você compre de um fornecedor de dados) contendo linhas (código postal, localidade, província), você poderá usá-la para ajudar a preencher sua tabela de endereços. Mas você deve evitar forçar seus endereços a conter apenas códigos postais codificados:essas tabelas de referência ficam desatualizadas muito rapidamente.