2016-12-22 140 views
0

我想弄清楚如何在我的数据库中定义外键。SQL多个外键与多个表上的单个外键

比方说,我有三个表:

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

我感到困惑的选项适用于什么情况下第二个选项。有人能给我一些两种选择的利弊暗示吗?

回答

3

TL; DR

第二个选项是什么,你应该寻找。也就是说,

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

说明

你必须看它从功能的角度,而不是查询的观点。 A WareHouseLocation指定了Warehouse的位置。因此,这种关系是有意义的(即外键看起来是合适的)。但是,如果您仔细考虑,WarehouseLocation的确与Site无关。因此,纯粹从功能角度来看,这种关系并没有多大意义。

但是,从查询的角度来看,它看起来很棒,你会需要检索大部分SiteIDWareHouseID,如果不是所有的情况下,查询在WareHouseLocation表时。让他们在同一张桌子上随时可用,可以减少和更轻松地查询任务。在数据库设计方面,这似乎是你困境的关键。

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

How far to take normalization in database design?

How does one know when to stop normalizing?

希望这有助于!

+0

好的谢谢,这个信息和给定的链接应该可以帮助我更好地掌握它! – RvL