2016-12-22 185 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