2009-12-14 34 views
1

我有一個採購訂單表和另一個表格來包含特定藥品採購訂單中的項目。選擇在兩個表之間附加外鍵的位置?

例子:

PO_Table (POId, MainPharmacyID, SupplierID, PreparedBy) 
PO_Items_Table (POItemID, ...) 

我有選擇的兩個選項,鏈接,表格,他們似乎這兩者有效。我已經做了很多次這樣做,並且做到了這一點。

  • 我很想知道他們是否有任何規則來附加外國?
  • 在我的情況下,我附加我的外鍵?

更新:

我的兩個選擇是把POItemID在PO_Table或將POID在PO_Items_Table。

更新2:

假設兩個表之間的關係是一對一的關係

+0

你正在選擇哪兩個選項? – Quassnoi 2009-12-14 15:33:23

+0

「我有兩個選擇」?你覺得你的兩個選擇是什麼?這種情況似乎很清楚PO_Table是PO_Items_Table的父/主。 – 2009-12-14 15:37:23

+2

請不要批評我的判斷。我想在這裏學習。 – Tebo 2009-12-14 15:38:50

回答

3

只是使它指向引用的表的PRIMARY KEY

PO_Table (POId PRIMARY KEY, MainPharmacyID, SupplierID, PreparedBy) 
PO_Items_Table (POItemID, POId FOREIGN KEY REFERENCES PO_Table (POId), ...) 

其實,在你的PO_Table我沒有看到除POId之外的其他候選關鍵字,所以現在這似乎是我唯一可用的解決方案。

你正在考慮什麼是「兩種選擇」?

更新:

POItemIDPO_Table不,除非你想你的訂單,其中沒有任何一個以上的項目的選項。

只要看看它:如果您只有一個列,它將訂購商品的id存儲在訂購表中,那麼您將在哪裏存儲其他商品?

更新2:

如果有一個一對一的關係,通常你剛剛合併的表:結合兩個表中的所有領域成爲一條記錄。

但是,有些情況下需要拆分表格。說,其中一個實體很少被定義,但有太多的領域。

在這種情況下,您爲第二個實體創建單獨的關係,並使其PRIMARY KEY列也爲FOREIGN KEY

讓我們想象一下,它描述了鎖和鑰匙的模型,並且鍵不能重複(這樣一個鎖最多一個關鍵,反之亦然匹配):

Pairs (PairID PRIMARY KEY, LockID UNIQUE, LockProductionDate, KeyId UNIQUE, KeyProductionDate) 

如果是一個沒有鑰匙鎖定或不鎖定某個鍵,我們只需將NULLS放入相應的字段中。

但是,如果所有的鍵有鎖,但只有少數的鎖,鑰匙,就可以拆表:

Locks (LockID PRIMARY KEY, LockProductionDate, KeyID UNIQUE) 
Keys (KeyID PRIMARY KEY, KeyProductionDate, FOREIGN KEY (KeyID) REFERENCES Locks (KeyID)) 

正如你所看到的,KeyID既是PRIMARY KEY,並在KeysFOREIGN KEY

你可能想讀這篇文章在我的博客:

,其中介紹了一些方法來ER模型(實體關係)映射到關係模型(表和外鍵)

+0

將POItemID放入PO_Table或將POId放入PO_Items_Table中。 – Tebo 2009-12-14 15:35:08

+0

我剛剛看到。那麼它是一對一的關係呢?從上面的答案中,邏輯的決定將隨之而來。我仍然需要將POId放在PO_Items_Table中。不是嗎? – Tebo 2009-12-14 16:02:33

+0

知道這件事真的很高興。特別是KeyID作爲主鍵和外鍵。 – Tebo 2009-12-14 16:37:25

3

您沒有兩個選項。外鍵約束必須附加到已在其中具有外鍵的表(以及列)。它必須引用(或指向)另一個表中的主鍵。當你說你已經做了很多次這樣的事情時,我不太明白你的意思......還有什麼其他的方法?

1

它看起來像你的PO_TablePO_Items_Table的邏輯父,這意味着PO_Table的主鍵應該被用作項目表的外鍵

0

如果PO代表「採購訂單」和PO項目代表採購訂單的單個行項目,那麼您只有一個關於如何設置外鍵的選擇。每個採購訂單可能有多個項目,但每個項目只有一個採購訂單。在這種情況下,Quassnoi給出了正確的設計。

作爲一個側光,每次我設計了一個採購訂單數據庫,我已經使Items表具有一個由POID和ItemID組成的複合主鍵。但ItemID在所有項目中不唯一,只是屬於單個PO的項目。每次我開始新的採購訂單時,我都會重新開始,ItemID等於1。這允許我稍後重新構建採購訂單,並按照訂單第一次創建時的順序獲取相同的訂單。對於大多數數據處理來說,這是一件微不足道的事情,但如果他們稍後再查看PO,並且由於他們感知順序,這些項目是無序的,它可能會推動客戶堅果。