Определение суррогатного ключа
Я занимаюсь моделированием в качестве практики в Авиакомпании. У меня есть стол "Пассажир"
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
);
Таблица "Пассажиры" будет содержать данные о пассажирах, которые не будут меняться от рейса к рейсу или от поездки к поездке.
Номер подтверждения может относиться к нескольким различным пассажирам - семье или футбольной команде, путешествующим вместе, - поэтому первичным ключом этой таблицы будет составной ключ, состоящий из всех четырех полей, как показано.
Кроме того, хотя верно, что суррогатный ключ не должен иметь к нему никакого делового значения, также верно, что это правило широко игнорируется. У вас очень хороший уникальный идентификатор, так почему бы не назвать его "номером подтверждения" или "номером счета" или любым другим из множества значимых имен?