Как обеспечить ограничение для ассоциативной таблицы, относящейся к двум исходным таблицам с общим внешним ключом? - PullRequest
1 голос
/ 14 октября 2011

Пример сценария.

В системе расписания полетов имеется таблица pilot, которая ссылается на таблицу plane_type, указывающую, на какие самолеты может летать пилот (при условии, что это отношение многих к одному).

Существует также таблица plane, которая ссылается на таблицу plane_type для указания типа самолета (также отношение многие-к-одному).

Теперь существует ассоциативная таблица flight_plan, которая присваивает pilot plane для данного полета.

Как мне убедиться, что квалификация pilot соответствует типу plane для этого рейса?

Есть ли возможность реализовать это как ограничение в дизайне базы данных? Спасибо.

Отредактировано:

Обращаясь к диаграмме ниже, как убедиться, что pilot.plane_type равно plane.plane_type?

enter image description here

1 Ответ

1 голос
/ 14 октября 2011

Plane имеет уникальный индекс (AK) для PlaneID, PlaneTypeID

enter image description here

РЕДАКТИРОВАТЬ

create table Pilot (PilotID integer);
alter table Pilot add constraint PK_Pilot primary key (PilotID);

create table PlaneType (PlaneTypeID integer);
alter table PlaneType add constraint PK_PlaneType primary key (PlaneTypeID);

create table PilotQualification (PilotID integer, PlaneTypeID integer);
alter table PilotQualification 
  add constraint  PK_PilotQual primary key (PilotID, PlaneTypeID)
, add constraint FK1_PilotQual foreign key (PilotID)     references Pilot(PilotID)
, add constraint FK2_PilotQual foreign key (PlaneTypeID) references PlaneType(PlaneTypeID) ;

create table Plane (PlaneID integer, PlaneTypeID integer);
alter table Plane
  add constraint  PK_Plane primary key (PlaneID)
, add constraint FK1_Plane foreign key (PlaneTypeID) references PlaneType(PlaneTypeID) ;
create unique index AK_Plane on Plane (PlaneID, PlaneTypeID) ;

create table PlanePilot (PlaneID integer, PlaneTypeID integer, PilotID integer) ;
alter table PlanePilot
  add constraint  PK_PlanePilot primary key (PlaneID, PlaneTypeID, PilotID)
, add constraint FK1_PlanePilot foreign key (PilotID, PlaneTypeID) references PilotQualification(PilotID, PlaneTypeID)
, add constraint FK2_PlanePilot foreign key (PlaneID, PlaneTypeID) references Plane(PlaneID, PlaneTypeID)
, add constraint FK3_PlanePilot foreign key (PilotID) references Pilot(PilotID) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...