我正在研究弱实体概念,并试图对关系进行建模Hotel has many rooms
。我已经提出了下面介绍的部分解决方案,但是我在唯一标识与特定酒店相关的房间实体中的元组时遇到了问题。
我的假设
- Hotel(hotel_number, name) 是一个强大的实体。
- Rooms(room_number, bed) 是一个弱实体,它的存在依赖于酒店的存在。
1. 酒店实体表
hotel_id | 姓名 |
---|---|
125 | n1 |
132 | n2 |
173 | n3 |
103 | n4 |
193 | n5 |
2.房间实体表
房间号 | 床 |
---|---|
101 | 3 |
101 | 2 |
102 | 1 |
103 | 6 |
有两家酒店的 hotel_id 为 125 和 132。hotel_id 为 125 的酒店的房间编号为 101,有 3 张床,另一家酒店的房间编号为 101,有 2 张床。那么如何在弱实体(即房间)没有 pk 的情况下对给定关系进行建模?
房间应该有 (hotel_id,room_number) 的 PK。
弱实体具有以强实体键/外键作为前导列的复合键。
有些人不同意这种方法,但他们错了。
就像是:
真正的问题是为什么表没有主键
Rooms
?在大多数情况下(除了一些边缘情况,如临时表),您的表上应该有一个主键。尽管如此,即使表上没有主键
Rooms
,看起来关系自然是多对一的Hotels
(即任何房间只能属于一个酒店),因此您至少可以添加一个外键字段上的Rooms
桌子hotel_id
。所以你的外键约束将Rooms.hotel_id
是Hotels.hotel_id
.但我的建议是在您的表中添加主键和外键字段。
Rooms
如果不做这些事情中的至少一件,就不可能在Rooms
和之间建立关系Hotels
。表上的主键Rooms
将定义在hotel_id, room_number
.