Как сделать связи в phpmyadmin через дизайнер

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

Доброе время суток!
Я только начинаю плотно работать с СУБД MySQL и у меня возникла такая проблема. Мне нужно создать базу в которой будет две таблицы, это таблица фирм и таблица услуг. Каждая фирма может предоставлять несколько разных услуг и в тоже время каждая услуга может выполнятся разными фирмами. Подскажите как можно это реализовать рациональней всего. Заранее спасибо.

Отношение многие-ко-многим традиционно реализуется введением третьей таблицы,
содержащей id из первых двух.

т.е. мне можно будет присвоить одному ID фирмы несколько ID услуг через запятую? или создавать для присвоения каждой отдельной услуги новую запись?

Спасибо большое за подсказку! Если еще кто-то подскажет как написать запрос который при выборе фирмы будет выводить все услуги которые предоставляет эта фирма. я буду очень благодарен!

Здравствуйте, тоже есть вопросы по связям. У меня есть таблица из 13-ти столбцов, которая по сути является набором id-шников. Эти id соответствуют id из других 13-ти таблиц с двумя столбцами, кроме id, в них находятся различные значения. То есть, содержимое, для первой таблицы фактически собирается из других 13-ти.
В "phpMyAdmin" в "Структуре" таблицы, а точнее под структурой, находится кнопка "связи". В ней, для каждого столбца, удобно добавлять соответствующую таблицу. Ну и в соответствующих таблицах, так же в "Структуре" в "связи" указать "Выбор отображаемого столбца".
На данный момент, мне в первой таблице всё красиво выводит, то есть полное и правильное содержимое прямо как в представлениях. Для первой таблицы создал "Представление", тоже удалось связать через "Дизайнер", так что мне видны полностью все поля.

Для того что бы было видно все поля, точнее нужное мне содержимое, в параметрах включил "Отображение связанного поля".

Пока что не дошёл до того что бы вывести на страницу сайта, первую таблицу. Даже не знаю что выйдет, толе вернёт числа(id), толе уже собранную таблицу.

Первый вопрос, что я получу если сделаю простой запрос (SELECT * FROM `b` WHERE 1; ) к первой таблице? И если получу id-шники? Как мне сделать так что бы выводило именно содержимое других 13-ти таблиц? Так же как это выглядит при включенном параметре "Отображение связанного поля" в "phpMyAdmin". Может есть какой-то "параметр"?

Если это реализуется:
Второй вопрос, как выглядит SQL запрос, для того что бы, задать такие "связи", как я организовал. И как выглядит SQL запрос для 13-ти таблиц, чтобы указать "Выбор отображаемого столбца". Что бы не делать эту муторную работу в ручную.

Понимаю что при создании админки сайта, и редактировании полей таблиц, простого решения не будет, но хотя бы для вывода данных, хотелось бы упростить себе жизнь. Есть необходимость часто делать операции по назначению "связей", и конечно же, не хотелось бы делать это вручную, отнимает уйму времени.
У меня 5-ть статических сайтов, суммарно более 2000 страниц, все по одной тематике и с одинаковой структурой, пробую их распарсить и сразу поместить данные в 5-ть таблиц, из каждой таблицы выполняю разброс по 13-ти таблицам. Всё время где-то что-то не совсем правильно обрабатывается (речь о PHP парсере), приходится пере создавать таблицы, и проделывать одни и те-же операции. С разбросом значений по 13-ти таблицам, через SQL запросы, проблем нету, но вот назначать "связи", в ручную, уже умаялся.

PHPMyAdmin Designer

При использовании инструмента PHPMyAdmin Designer я не вижу связей (линий, которые связывают каждое отношение внешнего ключа). Атрибуты внешнего ключа получают другой значок, чем другие атрибуты, однако отсутствует соединение по линии. Я уже пытался включить/выключить "Показать/скрыть отношения".

Что мне не хватает?

Я прочитал, что у вас должны быть таблицы типов innodb, хотя я не могу заставить это работать самостоятельно даже с базой данных всех таблиц innodb. Внешние ключи отмечены, но линии отношений не отображаются. Предполагается, что вы включили "просмотр отношения" (отметьте закладку структуры, чтобы увидеть, есть ли у вас "вид отношения", доступный для каждой таблицы), но для меня это делает нет разницы. Срыв!

Изменение: я настроил pma-пользователь, настроил привилегии. Нет предупреждений для настройки хранилища конфигурации - настроено согласно определению phpmyadmin wiki. Импортировано несколько баз данных. Никаких визуальных отношений в дизайнере! Внешние ключи импортируются, но разъемов нет в Designer.

27cm

Связь "многие-ко-многим" в MySQL реализуется через промежуточную таблицу.

Классический пример:
У нас есть две сущности (таблицы): авторы и книги. У каждого автора может быть несколько написанных книг, а книга может иметь нескольких авторов. Чтобы связать таблицу авторов (authors) с таблицей книг (books) создаётся дополнительная таблица authors_books, каждая запись (строка) которой содержит идентификатор автора и идентификатор книги.

authors_books:


Таким образом мы храним две книги:
1. "Учебник MySQL", Иванов И. И., Петров П. П.
2. "Учебник PHP", Петров П. П., Сидоров С. С.

Далее научимся создавать связи между таблицами в базе данных MySQL с помощью phpmyadmin. Если по какой-то причине вы не желаете использовать phpmyadmin, смотрите приведенные ниже SQL-запросы.

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

Например, можно запретить удалять категорию, если с ней связана хотя б одна заметка. Или удалить все заметки, если удалена категория. Или установить NULL в связующее поле. В любом случае, с помощью связей повышается отказоустойчивость и надежность приложения.

Для начала, движок таблиц должен быть InnoDB . Только он поддерживает внешние ключи ( foreign key ). Если у вас таблицы MyISAM , почитайте как их конвертировать в InnoDB .

Для того, чтобы связать таблицы по полям, необходимо сначала добавить в индекс связываемые поля:

В phpmyadmin выбираем таблицу Country , выбираем режим структуры, выделяем поле Id_Continent, для которого будем делать внешнюю связь и кликаем Индекс.

Добавляем индекс

Обратите внимание на разницу между "Индекс" и "Уникальный". Уникальный индекс можно использовать, например, до поля id, то есть там, где значения не повторяются.

Это же действие можно сделать с помощью SQL-запроса:

Аналогично добавляем индекс для поля Id_Language таблицы Country .

Аналогично можно добавить индекс (только в моем случае теперь уже уникальный или первичный) для таблицы, на которую ссылаемся, для поля id. Поскольку поле id у меня идентификатор, для него делаем первичный ключ. Уникальный ключ мог бы понадобится для других уникальных полей. Но так как мы его уже создали, принимаем информацию к сведению и идём дальше

index MySQL

С помощью SQL-запроса:

Теперь осталось только связать таблицы. Для этого кликаем внизу на пункт Связи:

Открываем окно СВЯЗИ

Теперь для доступных полей (а доступны только проиндексированные поля) выбираем связь с внешними таблицами и действия при изменении записей в таблицах:

Как оказалось, в удобном скрипте phpmyadmin есть еще и дизайнер связей БД — он позволяет наглядно отображать БД, их содержимое и создавать наглядные связи. Для активации этой функции надо:

1) Открываем /etc/phpmyadmin/config.inc.php и там раскомментируем все строки, которые начинаются с $cfg.У меня в конечном итоге содержимое файла стало такое:


/**
тут была куча ненужных комментариев.
*/

/* Authentication type */
$cfg[‘Servers’][$i][‘auth_type’] = ‘cookie’;
/* Server parameters */
$cfg[‘Servers’][$i][‘host’] = ‘localhost’;
$cfg[‘Servers’][$i][‘connect_type’] = ‘tcp’;
$cfg[‘Servers’][$i][‘compress’] = false;
/* Select mysqli if your server has it */
$cfg[‘Servers’][$i][‘extension’] = ‘mysql’;
/* Optional: User for advanced features */
$cfg[‘Servers’][$i][‘controluser’] = ‘pma’;
$cfg[‘Servers’][$i][‘controlpass’] = ‘ пароль ‘;
/* Optional: Advanced phpMyAdmin features */
$cfg[‘Servers’][$i][‘pmadb’] = ‘phpmyadmin’;
$cfg[‘Servers’][$i][‘bookmarktable’] = ‘pma_bookmark’;
$cfg[‘Servers’][$i][‘relation’] = ‘pma_relation’;
$cfg[‘Servers’][$i][‘table_info’] = ‘pma_table_info’;
$cfg[‘Servers’][$i][‘table_coords’] = ‘pma_table_coords’;
$cfg[‘Servers’][$i][‘pdf_pages’] = ‘pma_pdf_pages’;
$cfg[‘Servers’][$i][‘column_info’] = ‘pma_column_info’;
$cfg[‘Servers’][$i][‘history’] = ‘pma_history’;
$cfg[‘Servers’][$i][‘designer_coords’] = ‘pma_designer_coords’;

/*
* End of servers configuration
*/

2) Теперь с помощью например того же Phpmyadmin создаем базу с именем phpmyadmin и пользователя с именем pma не забыв установить пароль и дав все права на базу phpmyadmin.

3)Вверху выбираем пункт SQL для создания sql-запроса и пишем туда след:

DROP DATABASE IF EXISTS `phpmyadmin`;

CREATE DATABASE `phpmyadmin`;

GRANT SELECT, INSERT, DELETE, UPDATE ON `phpmyadmin`.* TO ‘pma’@localhost;

Читайте также: