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
);
乘客表将包含不会因航班或旅行而异的乘客数据。
一个确认号很可能是指几个不同的乘客——一个家庭或一起旅行的足球队——所以这个表的主键将是一个由所有四个字段组成的组合键,如图所示。
此外,虽然代理键不应该有任何商业意义,但这条规则被广泛忽略也是事实。您有一个非常好的唯一标识符,那么为什么不将其称为“确认号”或“帐号”或任何其他各种重要名称?