Как делать выборку при нормализации?

Если я правильно понял что такое нормализация, то вот пример:
287e782b9459a835b7001b918556e915.jpg
Вопрос 1: и как мне в этом случае выбрать всех юзеров из России например? (если в БД много городов и стран)
Вопрос 2: если к нормализованной таблице запрос сделать:
SELECT * FROM `юзеры` WHERE `id`='1'
Он вытянет все данные (город, за ним область, за ним страну)? Или что бы область и страну получить JOIN надо?

Как определить какие данные выводить из большой таблицы и приводить к нормальному виду, а какие оставить в большой таблице? (на 30 полей, например).
Пока я так понял что если данные чаще читаются то можно оставлять их в большой таблице, а вот те, которые часто пишутся надо выносить в отдельные таблицы т.е. делать нормализацию.
  • Вопрос задан
  • 2633 просмотра
Пригласить эксперта
Ответы на вопрос 2
@vdem
Сферический запрос в вакууме:
SELECT `юзеры`.*
FROM `юзеры`
    INNER JOIN `города`
        ON `города`.`id` = `юзеры`.`город_id`
    INNER JOIN `области`
        ON `области`.`id` = `города`.`область_id`
    INNER JOIN `страны`
        ON `страны`.`id` = `области`.`страна_id`
WHERE `страны`.`страна` = 'Россия'

Понятное дело, что такой запрос будет несколько медленным, так что я бы сделал еще таблицу `адреса`, на нее и будут ссылаться записи из `юзеры`, и в этой таблице хранить и `город_id`, и `область_id`, и `страна_id`. Для увеличения производительности иногда приходится отказываться от строгой нормализации, но в таком варианте хотя бы названия не дублируются, и если надо будет поменять 'Москва' на 'Москвабург', то это коснется только одной записи.
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Для данного случая - nosql базы смотрите. Здесь многомерные связи.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы