Данная статья посвящена разбиванию отношений многие ко многим на 2 отношениям 1 ко многим. Напомню, в посте про проектирование базы данных мы встречали вот такую схему
Но как ей воспользоваться на практическом уровне? Этим мы и займемся сегодня. Разные работники могут выполнять разные заказы. А как узнать какие заказы выполнил один конкретный работник? Это та задача, которая часто будет встречаться в отношении M:N, разбитом на 1:M и 1:N;
Создание модели и физической базы данных
В посте про проектирование базы данных, в самом конце мы занимались тем, что разбивали M:N, на 1:M и 1:N таким образом
В данной статье мы немного упростим задачу вот так…
Сделаем первичное заполнение из MySQL Workbench через Inserts внизу во вкладке редактирования таблицы, следующим образом – в workers и orders внесем по 2 записи, в их общую таблицу – 4 записи.
В таблицу заказов поместим 2 заказа
В таблицу работников поместим 2 работников
В их общую таблицу поместим следующую информацию. Оба работника выполняли 1 и 2 заказы.
Как узнать какие заказы выполнял 1 работник?
Выполним вот такой запрос
В результате у нас получилось, что первый работник выполнил 1 и 2 заказы – это правильный ответ, так как при первичном заполнении так и было.
Код запроса в MySQL
1 2 3 4 5 6 7 |
use mn_db; SELECT mn_db.workers.workers, mn_db.orders.orders FROM workers_has_orders inner join workers on workers_has_orders.Workers_idWorkers=workers.idWorkers and workers.idWorkers=1 inner join orders on workers_has_orders.Orders_idOrders=orders.idorders; |
В принципе, мы просто делаем пересечение множеств 2 раза, согласно реляционной алгебре – и получаем нужный нам результат.