Dal mio punto di vista lo stai rendendo troppo complesso. Non è necessario rendere lo schema degli indirizzi così sovranormalizzato. La maggior parte dei sistemi che ho visto che gestiscono più indirizzi di clienti hanno una tabella clienti come la tua e quindi hanno una tabella di indirizzi, come segue:
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
è una chiave esterna per il customer
tavolo. La chiave primaria è composta da (customer_id
, address_ordinal
). Il primary
la colonna è true
se l'indirizzo è quello principale.
Per quanto riguarda la tua domanda sui fornitori, potresti voler creare una tabella comune chiamata "contatti" e fornire contact_id ai tuoi clienti e fornitori.
Se il tuo sistema contiene una tabella di riferimento (forse qualcosa che acquisti da un fornitore di dati) contenente righe (codice postale, località, provincia), puoi utilizzarla per compilare la tabella degli indirizzi. Ma dovresti evitare di forzare i tuoi indirizzi a contenere solo codici postali codificati:quelle tabelle di riferimento diventano obsolete molto velocemente.