Определение суррогатного ключа

Я занимаюсь моделированием в качестве практики в Авиакомпании. У меня есть стол "Пассажир"

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,

2 ответа

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

Тем не менее, оба flightNum а также confirmationNum У вас есть бизнес-значение здесь, в вашей модели. Если вы используете один из двух (или оба вместе) в качестве ключа, то вы используете естественный ключ.

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

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

Поскольку вы говорите, что это практика, пожалуйста, разрешите еще несколько комментариев. Ваше имя таблицы предполагает, что в таблице содержится список пассажиров, но 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
);

Таблица "Пассажиры" будет содержать данные о пассажирах, которые не будут меняться от рейса к рейсу или от поездки к поездке.

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

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

Другие вопросы по тегам