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