我正在试图找出如何在我的数据库中定义外键。
假设我有三张桌子:
现在,
Site-Warehouse
是一对多的关系Warehouse-WarehouseLocation
是一对多的关系我何时会使用多个外键来描述WarehouseLocation
,一个到Warehouse.id
,一个到Site.id
?
Site --[ Warehouse
| ---
| |
+----[ WarehouseLocation
我什么时候才能使用:
Site --[ Warehouse --[ WarehouseLocation
在我查找WarehouseLocation
的第一个选项中,我需要Site.id
和Warehouse.id
。
在第二个选项中,当我查找WarehouseLocation
时,我需要Warehouse.id
,但要查找仓库,我需要Site.id
我很困惑哪种选择适合什么情况。有人可以给我一些关于两种选择的利弊的提示吗?
答案 0 :(得分:3)
<强> TL; DR 强>
第二个选项是您应该关注的内容。也就是说,
WareHouseLocation
表只有WareHouseID
外键和WareHouse
表将SiteID
作为 外键。
<强>解释强>
您必须从功能角度查看它,而不是查询透视图。 WareHouseLocation
指定Warehouse
的位置。因此,这种关系是有道理的(即外键似乎是合适的)。但是,如果您考虑一下,WarehouseLocation
实际上与Site
无关。因此,纯粹从功能角度看这种关系并没有多大意义。
但是,从查询的角度来看,它看起来很棒,因为在查询SiteID
表时,如果不是所有情况,您需要检索WareHouseID
和WareHouseLocation
。让它们在同一个表中随时可用将减少JOIN
并使查询变得更容易。这似乎是您在数据库设计方面的两难困境。
数据库设计是一个相当复杂的主题,需要考虑很多因素,其中一些是项目本身非常具体的。一般的经验法则是尽可能将数据库保持为规范化(尤其如果您正在阅读教科书)。然而,在实践中,许多数据库设计者更喜欢将数据库非规范化为现存的至少。归一化/非规范化数据库是一个很有见识的主题,所以我不会在这里深思熟虑。您可以在以下帖子中阅读更多相关信息:
How far to take normalization in database design?
How does one know when to stop normalizing?
希望这有帮助!!!