À mon avis, vous rendez cela beaucoup trop complexe. Il n'est pas nécessaire de rendre votre schéma d'adresse si sur-normalisé. La plupart des systèmes que j'ai vus et qui gèrent plusieurs adresses de clients ont une table de clients comme la vôtre, puis une table d'adresses, comme suit :
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
est une clé étrangère vers le customer
table. La clé primaire est un composé de (customer_id
, address_ordinal
). Le primary
la colonne est true
si l'adresse est la principale.
En ce qui concerne votre question sur les fournisseurs, vous souhaiterez peut-être créer une table commune appelée "contacts" et donner à la fois à vos clients et à vos fournisseurs des identifiants de contact.
Si votre système contient une table de référence (peut-être quelque chose que vous achetez auprès d'un fournisseur de données) contenant des lignes (code postal, localité, province), vous pouvez l'utiliser pour vous aider à remplir votre table d'adresses. Mais vous devez éviter de forcer vos adresses à ne contenir que des codes postaux codés en dur :ces tableaux de référence deviennent très rapidement obsolètes.