En mi opinión, estás haciendo esto demasiado complejo. No hay necesidad de hacer que el esquema de su dirección esté demasiado normalizado. La mayoría de los sistemas que he visto que manejan múltiples direcciones de clientes tienen una tabla de clientes como la suya, y luego tienen una tabla de direcciones, de la siguiente manera:
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
es una clave foránea para el customer
mesa. La clave principal es un compuesto de (customer_id
, address_ordinal
). El primary
la columna es true
si la dirección es la principal.
Con respecto a su pregunta sobre los proveedores, es posible que desee crear una tabla común llamada "contactos" y proporcionar tanto a sus clientes como a sus proveedores contact_ids.
Si su sistema contiene una tabla de referencia (tal vez algo que compre de un proveedor de datos) que contenga filas (código postal, localidad, provincia), puede usarla para completar su tabla de direcciones. Pero debe evitar obligar a sus direcciones a que solo contengan códigos postales codificados:esas tablas de referencia quedan obsoletas muy rápido.