Database design 具有可编辑部分的复合主键

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 | ------------------

(6/4编辑)

我正在设计一个数据库,其中包含以下关于酒店及其位置的表格(在这个问题中,假设酒店名称是唯一的):

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.接待处、房间等),而不是酒店作为建筑物可能建立的各种位置。我认为从表关系中可以看出这一点,但我还添加了一些示例数据,以供将来参考。