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

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

Наличие FK логично.
...
Рейтинг: 0 / 0
14.08.2006, 17:09
    #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
14.08.2006, 17:13
    #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
14.08.2006, 17:15
    #33917149
MrStudent
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация таблицу
Про on delete cascade я имел ввиду реализацию с FK
Какой вариант на ваш взгляд лучше....?
...
Рейтинг: 0 / 0
14.08.2006, 17:55
    #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
14.08.2006, 18:07
    #33917335
реализация таблицу
MrStudentпочему не выполняется
on delete cascade мне
не ясно

Патамушта у вас галимый MSSQL
Буээээ....
...
Рейтинг: 0 / 0
14.08.2006, 18:31
    #33917394
MrStudent
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
реализация таблицу
Большое спасибо rgb-dart за ответ
Тереь понятно ...
...
Рейтинг: 0 / 0
15.08.2006, 11:23
    #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]