在多对多关系中强制使用公共外键
Enforcing common foreign key in many-to-many relationship
我有以下有趣的数据建模问题。我将以餐馆为例进行说明:考虑以下三个实体:Restaurant
、Location
和 Offer
。
- 一个
restaurant
可以有很多locations
,一个restaurant
可以有很多offers
。
这些关系很容易表示:A Restaurant
table; Location
table 和 Restaurant
table 中的 FK
; Offer
table 和 Restaurant
table.
中的 FK
有趣的问题来了:
- 一个
offer
只能对restaurant
的某些locations
有效。
该限制的建模一开始似乎很简单:只需使用两个外键进行关联 table,一个来自 Offer
table,另一个来自 Location
table。
该解决方案的问题在于它不限制我关联不属于同一家餐厅的 offers
和 locations
。
我怎样才能以更好的方式对此进行建模,从而允许我在数据库级别强制执行该限制?
我的假设是,在您当前的模型中,Location 有 1 家餐厅,Offer 有 1 家餐厅。
您可以通过在 Offer 上创建一个复合键来解决您的问题:(Restaurant_ID, Offer_ID) 并将此键用作从 Location_Offers 到 Offer 的外键。
您可以在 Location 上执行相同的操作:创建一个复合键(Restaurant_ID、Location_ID)并将其用作从 Locations_Offer 到 Location 的外键。
这确保 Locations_Offer 中链接位置和报价的任何记录仅链接与同一餐厅有关系的记录。
我有以下有趣的数据建模问题。我将以餐馆为例进行说明:考虑以下三个实体:Restaurant
、Location
和 Offer
。
- 一个
restaurant
可以有很多locations
,一个restaurant
可以有很多offers
。
这些关系很容易表示:A Restaurant
table; Location
table 和 Restaurant
table 中的 FK
; Offer
table 和 Restaurant
table.
FK
有趣的问题来了:
- 一个
offer
只能对restaurant
的某些locations
有效。
该限制的建模一开始似乎很简单:只需使用两个外键进行关联 table,一个来自 Offer
table,另一个来自 Location
table。
该解决方案的问题在于它不限制我关联不属于同一家餐厅的 offers
和 locations
。
我怎样才能以更好的方式对此进行建模,从而允许我在数据库级别强制执行该限制?
我的假设是,在您当前的模型中,Location 有 1 家餐厅,Offer 有 1 家餐厅。
您可以通过在 Offer 上创建一个复合键来解决您的问题:(Restaurant_ID, Offer_ID) 并将此键用作从 Location_Offers 到 Offer 的外键。
您可以在 Location 上执行相同的操作:创建一个复合键(Restaurant_ID、Location_ID)并将其用作从 Locations_Offer 到 Location 的外键。
这确保 Locations_Offer 中链接位置和报价的任何记录仅链接与同一餐厅有关系的记录。