SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.06.2010 21:31:37

semenb
Участник
Зарегистрирован: 30.06.2010
Сообщений: 3

Заполнение связанных таблиц

Здравствуйте,

Я хочу написать небольшую административную утилиту на php для добавления данных в БД. Т.к. многие таблицы в БД являются связанными, я решил сделать форму для добавления данных так, чтобы в ней можно было внести данные не только в конкретную таблицу, но и в те таблицы, в которых внешние ключи отсылают к первичному ключу данной таблицы. Тогда пользователю вместо того, чтобы заполнять пять таблиц, относящихся к одному предмету, достаточно будет ввести данные в одну специально созданную форму. Ситуация осложняется тем, что некоторые связи имеют характер "многие ко многим".

Вначале я хотел использовать запрос, выбирающий из таблицы KEY_COLUMN_USAGE из INFORMATION_SCHEMA все внешние ключи, после чего исходя из этих данных сформировать отдельную таблицу, где описывались бы эти отношения. Однако наличие связей вида "многие ко многим" приводит к тому, что некоторые таблицы, согласно KEY_COLUMN_USAGE, отсылают к "промежуточным" таблицам (увы, не знаю их верного наименования с техинческой точки зрения). В то же время необходимо, чтобы при заполнении формы эти таблицы вообще никак не отображались; вместо этого поля для заполнения должны соответствовать колонкам той таблицы, которая ссылается на "промежуточную".

Но я подозреваю, что все сильно усложнил. Не могли бы вы помочь мне с этой проблемой? Проще говоря, как эффективно найти все таблицы, которые ссылаются на данную таблицу (учитывая возможность отношений "многие ко многим")?

Спасибо

Неактивен

 

#2 30.06.2010 22:18:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Заполнение связанных таблиц

Просто называйте таблицы связи каким-то особым образом. Например,
_links_tablea_tableb.

Вопросы по PHP следует задавать на webew.ru.

Неактивен

 

#3 30.06.2010 22:25:45

semenb
Участник
Зарегистрирован: 30.06.2010
Сообщений: 3

Re: Заполнение связанных таблиц

> Просто называйте таблицы связи каким-то особым образом. Например, _links_tablea_tableb.

Честно говоря, я не очень понимаю, что делать дальше.

Пока что мой запрос выглядит так:
mysql> select TABLE_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where CONSTRAINT_SCHEMA='база данных' and REFERENCED_TABLE_NAME='таблица, ссылки на которую я ищу';

Таким образом удается найти все таблицы, которые ссылаются на данную таблицу, однако я все еще не очень представляю, что делать со связанными таблицами.

Задаю этот вопрос именно в этом разделе, т.к. php-скрипт будет только посылать запрос; все остальное я хотел бы сделать средствами MySQL.

Неактивен

 

#4 30.06.2010 22:28:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Заполнение связанных таблиц

Если Вы хотите в результате вывести полный список таблиц, которые связаны,
причем используя только MySQL, то прийдется писать хранимую процедуру
(рекурсию иначе не организуешь). Для того, чтобы хранить результаты, проще
всего воспользоваться временной табличкой. Кстати, для того, чтобы избежать
циклов можно тоже воспользоваться табличкой «мест, куда уже заходили».

Неактивен

 

#5 30.06.2010 22:57:12

semenb
Участник
Зарегистрирован: 30.06.2010
Сообщений: 3

Re: Заполнение связанных таблиц

Спасибо за ответы!

Стало ясно, что для моих целей достаточно выводить только список таблиц, ссылающихся на нужную таблицу. Это осуществляет запрос выше. Что я не понимаю - это то, как справиться с "промежуточными" таблицами. Я собираюсь поступить следующим образом: выполнив приведенный выше запрос ("select TABLE_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where CONSTRAINT_SCHEMA='база данных' and REFERENCED_TABLE_NAME='таблица, ссылки на которую я ищу'"), с помощью функции left() выбрать из выдачи те поля, которые начинаются на lt_ (который я сделаю префиксом "промежуточных" таблиц). Следующим, третьим запросом я в выбранных таблицах (правда, пока не знаю, как это осуществить) нахожу все внешние ключи и то, на какие таблицы они ссылаются (т.е. повторяю первый запрос, но только для "промежуточных" таблиц), после чего исключаю из выдачи таблицу с названием той таблицы, ссылки на которую я ищу. Правилен ли такой подход и есть ли более простой способ?  Видимо, последовательность и обработку отсылаемых запросов лучше писать, все-таки, на php, так?

И еще: как осуществить выбор в третьем запросе? Это дело php или mysql?

Неактивен

 

#6 01.07.2010 00:05:43

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Заполнение связанных таблиц

Дело MySQL — хранить данные и быстро отвечать на запросы. Вы можете
засунуть в него часть логики приложения, если это разумно (например,
так делают, если не хотят давать права доступа на таблицы, а разрешают
изменять их только через процедуры). Сам по себе SQL — достаточно уре-
занный язык. Если ничто не заставляет писать на нем — особого смысла это
делать нету: можно логику писать на любом языке приложений.

Ну и, если будете писать логику внутри приложения, подумайте: может
быть, просто вытащить весь список таблиц из базы и обрабатывать уже
средствами нормального языка? Может оказаться проще. Заодно и закэ-
шировать где-то сможете smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson