SQL多个外键与多个表上的单个外键

时间:2016-12-22 07:23:28

标签: sql database database-design

我正在试图找出如何在我的数据库中定义外键。

假设我有三张桌子:

  • 网站(这是公司所在的网站),
  • 仓库(在此站点上可以有多个仓库)和
  • WarehouseLocation(在该仓库中有多个位置,例如货架)

现在,

  • Site-Warehouse是一对多的关系
  • Warehouse-WarehouseLocation是一对多的关系

我何时会使用多个外键来描述WarehouseLocation,一个到Warehouse.id,一个到Site.id

Site --[ Warehouse
  |         ---
  |          |
  +----[ WarehouseLocation

我什么时候才能使用:

 Site --[ Warehouse --[ WarehouseLocation

在我查找WarehouseLocation的第一个选项中,我需要Site.idWarehouse.id

在第二个选项中,当我查找WarehouseLocation时,我需要Warehouse.id,但要查找仓库,我需要Site.id

我很困惑哪种选择适合什么情况。有人可以给我一些关于两种选择的利弊的提示吗?

1 个答案:

答案 0 :(得分:3)

<强> TL; DR

第二个选项是您应该关注的内容。也就是说,

  

WareHouseLocation表只有WareHouseID   外键和WareHouse表将SiteID作为   外键。

<强>解释

您必须从功能角度查看它,而不是查询透视图。 WareHouseLocation指定Warehouse的位置。因此,这种关系是有道理的(即外键似乎是合适的)。但是,如果您考虑一下,WarehouseLocation实际上与Site无关。因此,纯粹从功能角度看这种关系并没有多大意义。

但是,从查询的角度来看,它看起来很棒,因为在查询SiteID表时,如果不是所有情况,您需要检索WareHouseIDWareHouseLocation。让它们在同一个表中随时可用将减少JOIN并使查询变得更容易。这似乎是您在数据库设计方面的两难困境。

数据库设计是一个相当复杂的主题,需要考虑很多因素,其中一些是项目本身非常具体的。一般的经验法则是尽可能将数据库保持为规范化尤其如果您正在阅读教科书)。然而,在实践中,许多数据库设计者更喜欢将数据库非规范化为现存的至少。归一化/非规范化数据库是一个很有见识的主题,所以我不会在这里深思熟虑。您可以在以下帖子中阅读更多相关信息:

How far to take normalization in database design?

How does one know when to stop normalizing?

希望这有帮助!!!