私の見解では、あなたはこれをあまりにも複雑にしている。アドレススキーマをそれほど正規化する必要はありません。複数の顧客アドレスを処理する私が見たほとんどのシステムには、次のような顧客テーブルがあり、次にアドレステーブルがあります。
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
customer
への外部キーです テーブル。主キーは(customer_id
の複合です 、address_ordinal
)。 primary
列はtrue
アドレスがプライマリアドレスの場合。
サプライヤに関する質問については、「連絡先」と呼ばれる共通のテーブルを作成し、顧客とサプライヤの両方にcontact_idsを指定することをお勧めします。
システムに(郵便番号、地域、州)行を含む参照テーブル(おそらくデータサプライヤから購入したもの)が含まれている場合は、それを使用してアドレステーブルにデータを入力できます。ただし、アドレスにハードコードされた郵便番号のみを含めるように強制することは避けてください。これらの参照テーブルは非常に早く古くなります。