繁体   English   中英

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

[英]SQL multiple foreign keys vs single foreign key on multiple tables

我试图弄清楚如何在数据库中定义外键。

假设我有三个表:

  • 网站(这是公司所在的网站),
  • 仓库(在此站点上可以有多个仓库),并且
  • 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

我对哪种选择适合哪种情况感到困惑。 有人可以给我一些两种选择的利弊提示吗?

TL; DR

第二个选项是您应该查看的内容。 那是,

WareHouseLocation表将仅具有WareHouseID作为外键,而WareHouse表将具有SiteID作为外键。

说明

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

但是,从查询的角度看,它看起来很棒,因为在大多数情况下(如果不是全部情况下)在WareHouseLocation表上进行查询时,您需要检索SiteIDWareHouseID 使它们在同一表中随时可用将减少JOIN ,并使查询变得容易得多。 就数据库设计而言,这似乎是您难题的症结所在。

数据库设计是一个非常复杂的主题,其中涉及很多考虑因素,其中一些因素非常适合项目本身。 一般的经验法则是保持数据库尽可能规范化尤其是在阅读教科书时 )。 但是,实际上,许多数据库设计人员都希望对数据库进行非规范化,以达到至少现有的水平。 对数据库进行规范化/非规范化是一个自以为是的主题,因此在此我将不再赘述。 您可以在以下文章中阅读有关它的更多信息:

在数据库设计中标准化要走多远?

如何知道何时停止规范化?

希望这可以帮助!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM