2016-09-14 7 views
0

Я моделирую как практику Авиакомпании. У меня есть таблица «Пассажир»Идентификация суррогатного ключа

CREATE TABLE Passenger 
(
    confirmationNum INTEGER NOT NULL, 
    flightNum  INTEGER NOT NULL, 
    seatNum   INTEGER NOT NULL, 
    name   VARCHAR(30) NOT NULL, 
    phone   VARCHAR(10) NOT NULL 
); 

Если я правильно, я бы сказал, число пассажиров, подтверждение и номер рейса являются суррогатными ключами. Мне интересно, такой атрибут, как seatNum, в этом случае также будет surrogate key или будет считаться natural key.

ответ

1

Я не согласен - суррогатный ключ - это искусственно введенный ключ - обычно один столбец, который не имеет никакого коммерческого значения.

Однако, flightNum и confirmationNumdo have бизнес смысл здесь в вашей модели. Если вы используете любой из двух (или обоих вместе) в качестве ключа, то вы используете натуральный ключ.

суррогатный ключ будет PassengerID INT, который будет введен, что не имеет никакого дальнейшего бизнеса это означает, кроме однозначной идентификации каждого пассажира в рамках ИТ-системы (но не «в реальном мире»).

0

SeatNum не является ключом. Сиденье - это сиденье. То есть дифференциации мест нет. Даже такие понятия, как «проездное сиденье» и «сиденье на окне», не являются результатом каких-либо признаков самого сиденья. В полете значение Seatnum должно быть уникальным, но такой ограниченной уникальности вряд ли достаточно, чтобы сделать его кандидатом на keyness.

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

Итак поля ConfirmationNum, FlightNum и SeatNum бы наиболее логично было бы узнать в таблице пересечений, как это:

create table Trip(
    ConfirmationNum int not null, 
    FlightNum  int not null 
    references Flights(ID), 
    SeatNum   int not null, 
    PassengerNum  int not null 
    references Passengers(ID) 
    -- Possible other attriutes such as price and departure date 
); 

В таблице Пассажиров будет состоять из пассажирских данных, которые не будут меняться от полета к полету или путешествию путешествовать.

Номер подтверждения может иметь отношение к нескольким пассажирам - семейной или футбольной команде, путешествующей вместе, поэтому основной ключ этой таблицы будет составным ключом, состоящим из всех четырех полей, как показано на рисунке.

Кроме того, хотя это верно, что суррогатный ключ должен не имеет никакого коммерческого значения, применяемого к нему, также верно, что это правило широко игнорируется. У вас есть отличный хороший уникальный идентификатор, поэтому почему бы не назвать его «номером подтверждения» или «номером учетной записи» или любым другим из множества значимых имен?