Database design 具有可编辑部分的复合主键
(6/4编辑) 我正在设计一个数据库,其中包含以下关于酒店及其位置的表格(在这个问题中,假设酒店名称是唯一的): (Database design 具有可编辑部分的复合主键,database-design,relational-database,composite-key,Database Design,Relational Database,Composite Key,(6/4编辑) 我正在设计一个数据库,其中包含以下关于酒店及其位置的表格(在这个问题中,假设酒店名称是唯一的): (HotelId,HotelLocationName)是HotelLocation中的主键。同一酒店中不能存在两个HotelLocationName相同的HotelLocationName 一些样本数据可以是: | Hotelid | HotelName | | HotelId | HotelLocationName | ------------------
HotelId
,HotelLocationName
)是HotelLocation
中的主键。同一酒店
中不能存在两个HotelLocationName
相同的HotelLocationName
一些样本数据可以是:
| Hotelid | HotelName | | HotelId | HotelLocationName |
---------------------------- -------------------------------
| 1 | Holiday Inn(1) | | 1 | Reception |
| 2 | Four Seasons | | 1 | Pool |
| 3 | Holiday Inn(2) | | 2 | Reception |
| 2 | Dinning room |
| 3 | Room 100 |
| 3 | Room 101 |
要求HotelName
和HotelLocationName
都是可编辑的
因此,对于Hotel
表,我使用生成的不可变HotelId
,并将HotelName
保留为具有唯一约束的备用键(AK)
我可以对HotelLocation
表执行相同的操作,并将其更改为:
[HotelLocation]
HotelLocationId PK
HotelId
HotelLocationName
其中(HotelId
,HotelLocationName
)是AK。
问题是,我有很多与之相关的表格,其中类似FK的(HotelId
,HotelLocationName
)与我不想失去的酒店有直接关系
我知道我仍然可以使用类似于HotelLocation
的AK的FK,但级联更新的问题仍然存在
我想用一种方式来生成HotelLocationId
,HotelLocationId
)PK,例如对每个新记录的特定HotelId
使用MAX(HotelLocationId)+1
,但如果有替代解决方案,我更喜欢
有什么共同的方法来处理这种情况吗?我想我更了解你的问题。你有一张像这样的旅馆桌子
Hotel
-----
Hotel ID
Hotel Name
...
酒店ID是主键。这是一个盲键,意味着它没有任何意义,除了识别酒店,如假日酒店。这是一个整数序列,从零开始,表中每个酒店递增一
您还有一张酒店位置表
Hotel Location
--------------
Hotel Location ID
Hotel Location
...
Hotel Association
-----------------
Hotel ID
Hotel Location ID
Date location established
...
酒店位置ID是另一个盲主键
您可以创建一个关联表来将这些表连接在一起。我假设假日酒店可以有多个位置,所以在Hotel表和Hotel Location表之间存在一对多关系
Hotel Location
--------------
Hotel Location ID
Hotel Location
...
Hotel Association
-----------------
Hotel ID
Hotel Location ID
Date location established
...
主键是Hotel ID和Hotel Location ID。这是建立两个表之间关系的表
你还应该有一个关于酒店位置ID的唯一索引,酒店ID,这样你就可以找到该位置的酒店
正如您所看到的,有一些特性与关联有关,比如创建日期、更新日期,或者其他特性
关联表或连接表提供表之间的关联。常用的方法是不要将可变字段作为表键的一部分,但我们已经做了。酒店多久换一次名?也许,你只是生活在昂贵的酒店名称更新。另外,每个酒店的名称如何是唯一的?难道没有数百家假日酒店吗?@GilbertLeBlanc 1)我们什么都没有过去,这就是问题的核心所在。2) 是的,很可能我可以做一些罕见的昂贵的更新,特别是对于特定的项目,但我还是想做一些更好的。此外,相关字段是酒店位置名称3)你说得对。为每个表修改DDL的脚本并不难。修改主表后,您可以重新引用它,以将所有位置替换为其新id。您可以导出、修改、导入或实时执行。只要确保你有一个好的备份,以防万一。不管你现在还是以后都要“付钱”。我现在就去做,而不是每次位置改变都去做。@Nic3500我编辑了这个问题,因为它不是很清楚。我仍然在设计数据库,它不是在生产中,也不保存任何数据。我的问题是关于“正确”选择酒店位置表PK。啊,好吧,那就容易多了@吉尔伯特布朗的评论是正确的。PK和FK不应基于可变值。这将为你以后节省很多工作。您的模型应该确保您不必因为新值而修改它。只有新的特点或爱好。抱歉花了这么长时间。我不知道你是否理解我的问题。不管怎样,我发布了答案,但我不明白,为什么我要使用连接表来处理一对多关系?@GiannisTsim:你不必使用关联表。如果您愿意,可以在酒店关联表中输入外键。我理解您混淆了酒店位置的含义。我指的是酒店内部的一个位置(e.x.接待处、房间等),而不是酒店作为建筑物可能建立的各种位置。我认为从表关系中可以看出这一点,但我还添加了一些示例数据,以供将来参考。