powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / реализация таблицу
12 сообщений из 12, страница 1 из 1
реализация таблицу
    #33914797
MrStudent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите как лучше реализовать таблицу с
иерархической рекурсивной связью.....
...
Рейтинг: 0 / 0
реализация таблицу
    #33914805
Kronus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrStudentПодскажите как лучше реализовать таблицу с
иерархической рекурсивной связью.....
Классический вариант:
ID - PARENT_ID
А для разнообразия можно почитать Joe Celco, у него была серия статей про деревья в SQL
...
Рейтинг: 0 / 0
реализация таблицу
    #33914940
MrStudent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а для вершины в PArent_ID какое значение необходимо указать?
...
Рейтинг: 0 / 0
реализация таблицу
    #33915012
MrStudent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я имел ввиду корень

не понятно как лучше делать с FK
или нет?
...
Рейтинг: 0 / 0
реализация таблицу
    #33915138
Kronus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ID PARENT_ID NAME
1 0 Корень
2 1 Лист
3 1 Узел
4 3 Лист
5 3 Лист

Наличие FK логично.
...
Рейтинг: 0 / 0
реализация таблицу
    #33917129
MrStudent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возник вопрос
я реализую таблицу следующим образом

CREATE TABLE Group_of_disks
(
GroupId int primary key not null identity(1,1),
type varchar(100) not NULL,
ParentGroupId int null ,
FOREIGN KEY (ParentGroupId) REFERENCES Group_of_disks on delete cascade
)
go



такая реализация на ваш взгляд верна?
и почему on delete cascade не хочет выполняться....
по-моему при удалении родителя нужно убирать и дочерние записи
????
...
Рейтинг: 0 / 0
реализация таблицу
    #33917139
MrStudent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если не использовать FK,
то тогда можно для корня назначить какое-либо значение ,те реализация будет следующей:
CREATE TABLE Group_of_disks (
GroupId int primary key not null identity(1,1),
type varchar(100) not NULL,
ParentGroupId int not null ,
-- FOREIGN KEY (ParentGroupId) REFERENCES Group_of_disks on delete cascade
)
go
почему не выполняется
on delete cascade мне
не ясно
...
Рейтинг: 0 / 0
реализация таблицу
    #33917149
MrStudent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про on delete cascade я имел ввиду реализацию с FK
Какой вариант на ваш взгляд лучше....?
...
Рейтинг: 0 / 0
реализация таблицу
    #33917296
rgb-dart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrStudentЕсли не использовать FK,
то тогда можно для корня назначить какое-либо значение ,те реализация будет следующей:
CREATE TABLE Group_of_disks (
GroupId int primary key not null identity(1,1),
type varchar(100) not NULL,
ParentGroupId int not null ,
-- FOREIGN KEY (ParentGroupId) REFERENCES Group_of_disks on delete cascade
)
go
почему не выполняется
on delete cascade мне
не ясно

Не выполняется вот почему.
Представьте, что у вас в таблице данные такие:

GroupId type ParentGroupId
1 'test1' 2
2 'test2' 1


при удалении любой из строк, каскадное удаление приведет к бесконечному циклу, на что и намекает вам Query Analyser :)

Query AnalyserIntroducing FOREIGN KEY constraint 'FK__Group_of___Paren__6754599E' on table 'Group_of_disks' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

Так что каскадное удаление не прокатит...
Можете попробовать использовать триггер на before delete (хотя я триггеры не люблю за то что о них забываешь постоянно :) )
Имхо, лучший вариант - удаляйте запись из такой таблицы отдельной процедурой, которая умеет удалять узлы дерева начиная с листьев.
А использовать FK надо по-любому. Для целостности данных. :)
...
Рейтинг: 0 / 0
реализация таблицу
    #33917335
MrStudentпочему не выполняется
on delete cascade мне
не ясно

Патамушта у вас галимый MSSQL
Буээээ....
...
Рейтинг: 0 / 0
реализация таблицу
    #33917394
MrStudent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо rgb-dart за ответ
Тереь понятно ...
...
Рейтинг: 0 / 0
реализация таблицу
    #33918375
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORACLE 8.1.7
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE TABLE Group_of_disks 
(
GroupId int primary key not null ,
type varchar( 100 ) not NULL,
ParentGroupId int null ,
FOREIGN KEY (ParentGroupId) REFERENCES Group_of_disks on delete cascade
)
;
INSERT INTO Group_of_disks    
  SELECT  1 , 'test1',  2  FROM dual
  UNION 
  SELECT  2 , 'test1',  1  FROM dual
;
  Insert -  2  row(s), executed in  0 . 016  sec.


SELECT * FROM Group_of_disks; 
   2  first records fetched in  0 . 016  sec.

DELETE FROM Group_of_disks WHERE GroupId = 1 ;
SELECT * FROM Group_of_disks;            
   0  first records fetched in  0 . 031  sec.

Логически бесконечный цикл при удалении не возможен - в худшем случае будут удалены все записи. Просто не все СУБД об этом знают :)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / реализация таблицу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]