Учебно-практическое пособие москва 2017 ббк


FOREIGN KEY ( arrival_airport )



Pdf көрінісі
бет78/243
Дата21.07.2022
өлшемі3,05 Mb.
#147663
түріУчебно-практическое пособие
1   ...   74   75   76   77   78   79   80   81   ...   243
Байланысты:
Язык SQL. Базовый курс

FOREIGN KEY ( arrival_airport )
REFERENCES airports ( airport_code ),
FOREIGN KEY ( departure_airport )
REFERENCES airports ( airport_code )
);
В таблице предусмотрено три внешних ключа, которые ссылаются на таблицы «Само-
леты» (aircrafts) и «Аэропорты» (airports). В качестве первичного ключа используется
так называемый
суррогатный ключ
, состоящий из одного атрибута — flight_id. Об-
ратите внимание, что тип данных этого атрибута — serial, т. е. значения целого типа
для этого атрибута будут извлекаться из последовательности. Суррогатный ключ —
это уникальный ключ, назначение которого — только идентифицировать строки в
таблице. Зачастую для него используются целочисленные значения. Такому ключу не
соответствует никакое свойство никакой сущности реального мира. Это — абстрак-
ция, позволяющая в ряде случаев упростить определения таблиц, например, за счет
сокращения числа атрибутов во внешних ключах до одного. В нашей таблице «Рейсы»
(flights) суррогатный ключ как раз и служит для того, чтобы в таблицах, ссылающихся
на нее, внешние ключи состояли только из атрибута flight_id.
Конечно, существует и естественный уникальный ключ, состоящий из двух атрибу-
тов: номер рейса (flight_no) и время вылета по расписанию (scheduled_departure). Для
него нам придется создать уникальный ключ, чтобы избежать дублирования значе-
ний: очевидно, что в один и тот же момент времени не могут выполняться два (и
более) рейса, имеющие один и тот же номер.
Обратите внимание, что для атрибутов, имеющих смысл даты/времени, выбран тип
данных timestamptz, т. е. временная отметка с указанием часового пояса. Это важно,
т. к. перелеты могут совершаться между городами, находящимися в разных часовых
поясах, а время вылета и время прилета указывается местное.
Поясним смысл каждого из трех ограничений CHECK. Первое ограничение говорит
о том, что время прилета по расписанию должно быть больше времени вылета по
расписанию. Это представляется очевидным, т. к. длительность полета всегда больше
нуля.
82


Второе ограничение более сложное. Его можно условно разделить на две части, со-
единенные логической операцией «ИЛИ». Первая часть говорит о том, что если са-
молет
еще не прилетел
(т. е. значение actual_arrival равно NULL), то фактическое вре-
мя вылета нас, образно говоря, не интересует. Самолет мог еще не вылететь или уже
вылететь. Но даже если он уже и вылетел, и значение атрибута actual_departure отлич-
но от NULL, то все равно сравнить его со значением атрибута actual_arrival, которое
пока еще равно NULL, невозможно. Речь идет о сравнении вида «
>
» или «
<
». Вто-
рая часть этого ограничения должна гарантировать, что если самолет
уже прилетел
,
то, во-первых, фактическое время вылета должно быть не равно NULL, а во-вторых,
фактическое время прилета должно быть больше фактического времени вылета.
И наконец, третье ограничение CHECK ограничивает множество допустимых значе-
ний атрибута status следующим списком:
– Scheduled — рейс доступен для бронирования (это происходит за месяц до плано-
вой даты вылета, а до этого запись о рейсе не существует в базе данных);
– On Time — рейс доступен для регистрации (за сутки до плановой даты вылета) и не
задержан;
– Delayed — рейс доступен для регистрации (за сутки до плановой даты вылета), но
задержан;
– Departed — самолет уже вылетел и находится в воздухе;
– Arrived — самолет прибыл в пункт назначения;
– Cancelled — рейс отменен.
Просмотреть описание таблицы в базе данных можно так:


Достарыңызбен бөлісу:
1   ...   74   75   76   77   78   79   80   81   ...   243




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет