![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| pushok |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 7.2.2007 Репутация: нет Всего: нет |
Здравствуйте.
Вопрос следующий: В базе данных в одной таблице одна запись может ссылаться на другую в той же таблице. При этом неизвестно какой длины может получиться цепочка ссылающихся друг на друга записей. Закольцованных записей получиться не может. Если я удаляю одну из них, то все ссылающиеся на нее должны быть удалены. Это я бы смог сделать. Но если у меня цепочка из N-уровней, а я удаляю запись 1-го уровня, мне нужно удалить все записи на всех N-уровнях. Имеется: id - уникальный номер записи p_id - номер записи на которую ссылается данная (если 0, то не ссылается, т.е. 1й уровень). Если бы было 2 уровня, и надо удалить запись с id=id1: выбрал бы из таблицы все записи у которых p_id=id1 и удалил бы их Теоретически можно реализовать это рекурсивной функцией (пока не пробовал). Возможно есть какие-то более совершенные варианты? Заранее благодарен за помощь. |
|||
|
||||
| pushok |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 7.2.2007 Репутация: нет Всего: нет |
Вот такая функция получилась:
Работает хорошо. Но получается много запросов к базе данных. Или мне кажется? Нужна консультация "бывалых" = ) |
|||
|
||||
| Mavrun |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 25.11.2007 Репутация: 2 Всего: 13 |
Подписываюсь под вопросом. Подобную проблему решил схожей функцией, но не знаю, насколько это оптимально.
|
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
сколько возможных схем хранения древовидной структуры в реляционной БД? Список смежности(adjancy list), все родители в виде строки через запятую(materialized path) и вложенные множества(nested sets). если у тебя не дерево, а произвольный граф, то у тебя остается только adjancy list. и тут никак, кроме рекурсии, не выйти из положения. кстати, каждый элемент может ссылаться только на один другой элемент или на несколько? если все же на один, то это называется деревом и тогда для хранения можно использовать другую структуру, только adjancy list из названных приводит к использованию рекурсии. остальные позволяют обрабатывать целые ветки за один запрос.
а если отношения элементов не "один-ко-многим", а "многие-ко-многим", т.е. у тебя все-таки граф, то придется оставить adjancy list, но можно повесить триггер на удаление и возложить рекурсивность на плечи СУБД. |
|||
|
||||
| capitan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 602 Регистрация: 27.2.2005 Где: Москва Репутация: 2 Всего: 13 |
Чтобы таких вопросов не возникало, необходимо правильно составить структуру БЗ. Тогда перемещения, удаления и т.д. делаются одним запросом. О чем skyboy и написал выше.
http://www.getinfo.ru/article610.html |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |