Структура данных таблицы SQL, это неправильно? Использование КАСКАДНОГО удаления

Вот 3 таблицы, с которыми у меня проблемы:

  • Таблица: Возможности — содержит различные описания возможностей (должностей)

  • Таблица: Opportunities_Applicants — Содержит различные кандидаты, подающие заявки на вакансию. 1 заявитель может подать заявку только на 1 вакансию, однако на 1 вакансию может быть много претендентов

  • Таблица: Opportunities_Category — содержит имя и тип категории. 1 категория может относиться ко многим возможностям.

Я пытаюсь выполнить КАСКАДНОЕ удаление, когда категория возможностей удаляется, она удалит соответствующие возможности и кандидатов для этих возможностей.

Подходит ли эта структура или я должен настроить базу данных по-другому? Как должны быть настроены отношения между таблицами, чтобы КАСКАДНОЕ удаление работало при удалении категории возможности?

Должен ли я вообще использовать CASCADING Delete?

create table Opportunities_Category
(   
CategoryID          int identity(1,1)       not null
    constraint PK_CategoryID primary key clustered,         
[Name]              varchar(150)            not null,
[Type]              varchar(100)            not null --Pay, Volunteer, Volunteer Yearly
)

create table Opportunities
(
OpportunityID       int identity(1,1)   not null
    constraint PK_OpportunityID primary key clustered,
CategoryID          int                     not null
    constraint FK_CategoryID foreign key references Opportunities_Category(CategoryID) ON DELETE CASCADE,       
Title               varchar(300)            not null,
PostingDate         datetime                not null,
ClosingDate         datetime                not null,
Duration            varchar(150)            not null, --Part Time, Full Time, Seasonal, Contract
Compensation        varchar(150)            not null, --Hourly, Volunteer, Salary
[Description]       varchar(5000)           not null,
Qualifications      varchar(5000)           not null,
Show                int                     not null
)

create table Opportunities_Applicant
(
ApplicantID             int identity(1,1)   not null
    constraint PK_ApplicantID primary key clustered,
OpportunityID           int                 not null
    constraint FK_OpportunityID foreign key references Opportunities(OpportunityID) ON DELETE CASCADE,
[First]                 varchar(150)        not null,
[Last]                  varchar(150)        not null,
Phone                   varchar(20)         not null,
Cell                    varchar(20)         not null,
EMail                   varchar(200)        not null,
CoverLetterResume       varchar(300)        null,
[Timestamp]             datetime            not null    
)   

person Mausimo    schedule 19.04.2011    source источник


Ответы (2)


Оказывается, мои таблицы настроены правильно:

Вчера я пытался сделать: УДАЛИТЬ ИЗ ВОЗМОЖНОСТЕЙ, ГДЕ CategoryID = @CategoryID. Это было только удаление записей из Opportunities и Opportunities_Applicants.

Сегодня я изменил на: УДАЛИТЬ ИЗ Opportunities_Categoies, ГДЕ CategoryID = @CategoryID и все 3 таблицы удаляют соответствующие записи!

person Mausimo    schedule 20.04.2011

ALTER TABLE [dbo].[Возможности] С ПРОВЕРКОЙ ДОБАВИТЬ ОГРАНИЧЕНИЕ [FK_OpportunitiesCategory_Opportunities] FOREIGN KEY([CategoryID]) REFERENCES [dbo].[Opportunities_Category] ([CategoryID]) ON DELETE CASCADE GO

Удачи...

person Borik    schedule 19.04.2011
comment
разве это не то же самое, что я делаю... ограничение FK_CategoryID ссылается на внешний ключ Opportunities_Category (CategoryID) ON DELETE CASCADE в таблице Opportunities - person Mausimo; 20.04.2011
comment
То же самое, извините, не прокрутил вправо, чтобы увидеть ON DELETE CASCADE... - person Borik; 20.04.2011