Как хранить адреса в БД?

Понимаю, что этот вопрос был здесь задан не раз, те топики я читал и полезного как-то не вынес. Поэтому прошу не судить строго, подниму эту тему еще раз.

Мне нужно хранить в БД персональные данные (имя человека, email, телефон) и адреса (допустим этих же людей). Вопрос в том, как спроектировать таблицу(ы) для хранения адресов. Первой моей идеей было хранить адреса прямо в таблице юзеров (вместе с мейлом и телефоном).

Вторая идея - вынести в отдельную таблицу адресов и хранить там в форме id, city, street, house, apt. Но это не решает проблему вертикальной дупликации строковых значений: у меня будет очень много Москв и Санкт-Петербургов, например. Значит, нужно создать таблицу city и снова делать туда FK и потом JOINить все это дело. Улицы, по идее тоже бы неплохо хранить в своей таблице и связать их с теми городами, которым они принадлежат.

На самом деле уже получается довольно громоздкая БД для такого просто приложения (по сути простейшая CRM система). Вот и когда я уже дошел до такого состояния, что для выполнения простейшего запроса нужно сделать запрос в 3 JOINа на 4 таблицы, я заметил интересную вещь у меня вертикальную дупликация как минимум идет по именам: и вот я сейчас думаю, почему меня должно смущать, что у меня в таблице 2000 Москв, а 2000 Андреев - это нормально?

Или нужно создавать таблицу с именами? ;)

В общем, по большому счету вопрос сводится к тому, насколько она нужна в данном случае нормализация и насколько глубоко это все нужно нормализовывать?
 
Сверху