Все таблицы на картинке соединены, и с нормализованной базой данных, чтобы получить, например, всех пользователей из определенной страны, я должен объединить все таблицы.
У вас естьобъединить все таблицы, потому что вы используете суррогатные ключи (идентификационные номера), а не потому, что таблицы «нормализованы».Использование суррогатных ключей, таких как номера идентификаторов, не имеет ничего общего с нормализацией.
Естественные ключи и ограничения внешнего ключа - это все, что вам нужно для решения вашей проблемы.
Самый простой способ увидеть, как это работает, - это начать с полных данных и работать в обратном направлении.Предположим, что все данные верны.
addr_id street street_num region city country
--
1 Babukiaeeva 3a 10000 Zagreb Croatia
2 Riva 16 51000 Rijeka Croatia
3 Andrije Hebranga 2-4 10000 Zagreb Croatia
4 Andrijeviaeeva 2 110000 Zagreb Croatia
Чтобы записать факты типа "Регион" 10000 "связан с городом" Загреб "в стране" Хорватия ", создайте новую таблицу и заполните ее изэтот запрос.
SELECT DISTINCT region, city, country from addresses;
Таблица будет выглядеть следующим образом.
Table: regions
Primary key: {region, city, country}
region city country
--
10000 Zagreb Croatia
51000 Rijeka Croatia
110000 Zagreb Croatia
Затем установите ссылку на внешний ключ.
ALTER TABLE addresses
ADD CONSTRAINT FOREIGN KEY (region, city, country)
REFERENCES regions (region, city, country);
Чтобы записать факты типа «Город« Загреб »находится в стране« Хорватия »», создайте новую таблицу, заполните ее по этому запросу.
SELECT DISTINCT city, country from regions;
Таблица будет выглядеть следующим образомthis.
Table: cities
Primary key: {city, country}
city country
--
Zagreb Croatia
Rijeka Croatia
Затем установите ссылку на внешний ключ.
ALTER TABLE regions
ADD CONSTRAINT FOREIGN KEY (city, country)
REFERENCES cities (city, country);
Повторите для стран.Таблицы стран, городов и регионов являются ключевыми, поэтому они находятся в 5NF.(У них не может быть никаких неключевых зависимостей, потому что у них нет неключевых столбцов.) В контексте большой области, как и во всей Европе, вполне вероятно, что таблица адресов также находится в 5NF.
С точки зрения производительности запросов, он, скорее всего, будет обходить вашу текущую схему, потому что он не нуждается в соединениях.
Возможно, вы захотите использовать ON UPDATE CASCADE
;Вы можете не хотеть каскадно удалять, хотя.