2012-02-11 120 views
5

我有2個表,UserEmployee。每個用戶都有一個User_ID,這是User表中的主鍵和Employee表中的外鍵。 Employee表中的該屬性是否也是主鍵?數據庫屬性可以是主鍵和外鍵嗎?

+0

Employee表中的主鍵是什麼?每個表中只允許有一個主鍵。您可以執行復合主鍵(多個列)。 – 2012-02-11 22:08:18

回答

20

如果您在兩個表之間有一對一的關係,那麼細節表的主鍵也是一個外鍵。

master   detail (1 : 1) 
+----------+ 1:1 +-------------+ 
| PK id |<---o| PK FK id | 
+----------+  +-------------+ 
|  col1 |  |  col1 | 
|  col2 |  |  col2 | 
|  etc. |  |  etc. | 
+----------+  +-------------+ 

如果你有米對n關係,結合表具有與所述m的兩個主鍵和n的表列。這些列同時是主鍵和外鍵。

    m : n 
m_table   junction 
+----------+ 1:m +------------+  n_table 
| PK id1 |<---o| PK FK1 id1 | n:1 +----------+ 
+----------+  | PK FK2 id2 |o--->| PK id2 | 
|  col1 |  +------------+  +----------+ 
|  col2 |  |   |  |  col1 | 
|  etc. |  +------------+  |  etc. | 
+----------+      +----------+ 

請注意,這個結構,一個表的記錄只能鏈接到其他表的特定記錄一次,因爲路口表中的每一複合主鍵必須是唯一的。如果你想允許非唯一配對,確定在結合表一個單獨的主鍵:

    m : n 
        junction 
       +---------+ 
m_table   | PK id | 
+----------+ 1:m +---------+  n_table 
| PK id1 |<---o| FK1 id1 | n:1 +----------+ 
+----------+  | FK2 id2 |o--->| PK id2 | 
|  col1 |  |   |  +----------+ 
|  col2 |  +---------+  |  col1 | 
|  etc. |      |  etc. | 
+----------+      +----------+ 

在這種情況下,主鍵和外鍵約束在不同的欄目設置。或者,您也可以使用兩個外鍵加上一個分子或另一個辨別屬性來構建主鍵。


在你的情況,如果有一個一對一或一對零或一UserEmployee之間的關係,那麼,在EmployeeUser_ID可外鍵(FK)和主鍵(PK)。換言之,這意味着:用戶也可以是員工,在這種情況下,員工數據將被附加到用戶。如果他不是員工(他可能是外部專家),則不附加員工記錄。如果User_IDEmployee中的FK和PK,則每個用戶最多可以附加一個員工記錄。如果User_ID在表Employee中只有FK但不是PK,則用戶可能有多個相關的員工記錄。

2

是的。例如,如果您想要強制所有員工都是用戶,並且某些用戶可以成爲員工,則會這樣做。這將是(零或一)到一個關係。

否則,您通常不會將主鍵與外鍵相同,儘管它可能包含外鍵,例如多點對多點關係的結點表。