日期:2014-05-17  浏览次数:20811 次

疑惑一个例子,请较一下大家的想法
Hotel (hotelNo, hotelName, city)
Room (roomNo, hotelNo, type, price)
Booking (hotelNo, guestNo, dateFrom, dateTo,roomNo)
Guest (guestNo,guestName,guestAddress)

************************************************************************
where Hotel contains hotel details and hotelNo is the primary key ;
Room contains room details for each hotel and (roomNo, hotelNo ) forms the primary key ;
Booking contains booking details and (hotelNo,guestNo,dateFrom) forms  
the primary key
Guest contains guest details and guestNo is the primary key.
************************************************************************

我在想,为什么这些表中的一些表,要有这么多主键?
例如,Booking这个表,有必要要那么多主键吗?我认为一个表中有一个主键就可以了。
这里的外键,我认为有这几个,请大家看下,我说的对吗。
外键:
在Room表中,hotelNo是外键。
在Booking表中,guestNo,roomNo是外键

我说的对吗?

------解决方案--------------------
1.一个表只能有一个主键;
2.这个主键可以实施在多个列上。因此一个表的主键可能包含多个列,但不能说有个主键;
3.是否需要吧主键建在多个列上,根据你的业务需求来决定。BOOKING这个表,主键含3个字段有必要。如果只建主键在hotelNo上,那么一个hotel下有多个guest的要求就没法实现。
4.外键我猜也该这么建。
------解决方案--------------------
1.每张表中均定义主键是个良好的习惯,将来省去处理冗于的记录的时间。

2.“在Room表中,hotelNo是外键。 
在Booking表中,guestNo,roomNo是外键”,我想楼主说的是对的。
因为这些列的取值受限于另一表中的主关键字。




------解决方案--------------------
一个表只能有一个主键。可以多个列
------解决方案--------------------
一个表一个主键,一个主键可能包含这个表的多个列。表的主键包含的列可能是其他表外键包含的列。