Привет. Сегодня мы затронем важный вопрос: нормализации базы данных и mysql join. Многие, если ещё не используют, то наверняка слышали о нормализации таблиц баз данных.

MySQL join

Если коротко, то нормализации таблиц базы данных — это процесс упрощения данных в таблицах, вынос исчерпывающих (мало используемых, или громоздких) данных в отдельные таблицы. На простом примере, это можно объяснить так: у нас есть таблица товаров в интернет магазине. Каждый товар должен иметь значения:

название товара
название категории товара (к которой принадлежит товар)
описание
ссылка на фотографию
цена

Теперь представьте, в магазине 10000 товаров. У каждого товара прописано название категории, к которой он принадлежит. Для того, чтобы просто вывести список товаров в категории нам прийдется перебрать все-все товары (10000 шт) и определить указано у него такое название категории или нет. Это не нормально, процесс полнотекстового поиска неоправданно длинный для такой задачи, как просто вывод списка товаров.

Что же делать?
Нормируем базу данных. Первым делом сделаем ещё таблицу категорий, где будет хранится только название категории и ID (идентификатор категории):

Category:
id_category
category_name

В товаре удалим колонку с названием категории (она только занимает лишнее место). И также добавим колонку с численным идентификатором ID.

Product:
id_product
product_name
description
photo
price

Теперь сделаем третью таблицу, для связи товара и категории, там будет использоваться только 2 колонки: id_category, id_product.

Product_Category:
id_category
id_product

Теперь при добавлении товара в категорию будет создаваться запись в таблице Product_category, с ID категории и ID нового товара.

А при выборе списка товаров будет происходить быстрый поиск по ID категории, и последующий выбор списка соответствующих товаров. Этот процесс намного быстрее и лояльнее к использованию ресурсов.

Что получается в итоге, если нам нужно вывести список товаров, то нужно сделать выборку из таблицы Product_category:

SELECT id_product FROM Product_category WHERE id_category=2

Мы получаем список ID товаров, но как же получить сами товары?ё

Вот тут нам на помощь и прийдет MySQL Join

Сама по себе команда MySQL JOIN, как и следует из её названия, объединяет таблицы в запросе. Используется для связывания ранее нормированных (и не только) таблиц в один результат. При этом колонки объединенных таким образом таблиц просто выводятся одна за другой.

MySQL JOIN бывает нескольких видов:
— INNER JOIN
— OUTTER JOIN
— LEFT JOIN
— RIGHT JOIN
— INNER JOIN
Они обладают некоторыми различиями, которые могут повлиять на результат выборки для крупных таблиц. Более подробно про разницу в MySQL JOIN можете прочитать в простой статье на Wiki.

Но для нашего практического примера существенной разницы не будет, поэтому будем использовать простой LEFT JOIN (который кроме всего и самый распространенный в современном WEB.

Итак, нужно вывести список товаров из категории 2 при условии, что есть таблица товаров и таблица связей между товаром и категорией при помощи MySQL JOIN.

Сначала рассмотрим синтаксис MySQL Join:

SELECT (tab1.field1, tab2.field2) FROM tab1 LEFT JOIN tab2 ON tab1.field1=tab2.field1 WHERE tab1.field2=value AND tab2.field2=value2 (ORDER, GROUP и др.)

Итак, по порядку. Сначала это обычный SELECT запрос. Потом мы добавляем к результатам другую таблицу через LEFT JOIN но при добавлении обязательно нужно указать какие именно записи должны добавляться в результат, поэтому мы указываем директивой ON, что добавить нужно только те записи, у которых field1 равен field1 в добавляемой таблице. Далее продолжается обычный SELECT запрос, с возможностью указывать WHERE для обоих таблиц, ORDER и др. Объединяемых таким образом таблиц может быть сколько угодно, а в качестве списка полей после SELECT можно ставить привычную *, чтобы вывести все поля (тогда выведутся все поля из объединенных таблиц).

А теперь вернемся к нашему примеру, и рассмотрим решение при помощи MySQL JOIN:

SELECT * FROM product_category LEFT JOIN product ON product_category.id_product=product.id_product WHERE product_category=2

Все, в результате будут все поля товаров, принадлежащих к категории 2, кроме того, посколько в запросе мы использовали *, то будет и название категории и её ID.

Благодарю за внимание, надеюсь, эта статья поможет вам улучшить ваши базы данных и оптимизировать запросы. Если остались вопросы, задавайте в комментарии или в зеленую кнопку «Задать вопрос специалистам».