Z tego co wiem, silnik bazodanowy najbardziej angażuje operacja join- w teorii, najpierw on łączy każdy rekord tabeli A, z każdym rekordem tabeli B, a potem z wyniku wywala te, które nie spełniają warunku złączenia- w praktyce tak się nie dzieje, bo silnik bazy danych jest sprytny i robi to trochę inaczej, ale jednak łączenie tabel, to sporo wysiłku- zatem, im więcej masz tabel, tym więcej złączeń musisz robić, co nie zawsze musi, ale może kończyć się sporym czasem zwrócenia wyników.
Dłubałem przy sporym systemie automatyzującym wysyłki (niestety tylko w ramach szkolenia) i tam adresy były zawarte w tabeli Customers, czyli analogicznie jak w twoim przykładzie- nie rozbijano tego na osobną tabelę Addresses. Tabela ta miała chyba ze 20-30 atrybutów, bo była tam cała masa innych informacji (nie będących kluczami obcymi), więc albo system był do bani, albo coś jest na rzeczy. :)
Musisz też zadać sobie pytanie, których danych będziesz używać bardzo często, a których jedynie raz za czas- generalnie można chyba przyjąć, że poświęcając poziom spójności danych, zyskujesz na prędkości i odwrotnie- musisz zdecydować, co gdzie potrzebujesz.