2010-09-20 65 views
0

兩個表如下:數據庫設計外鍵是在我的數據庫

[Employee] Table: 
Id (Primary Key, Autoincrement) 
FirstName 
LastName 
Status 

[Status] Table: 
Status (Primary Key) 

狀態爲下列之一:「全職」「承包商」「終止」

應該如何[僱員] .STATUS參考[Status] .Status作爲外鍵?我看到這樣的方法有兩種:

  1. [僱員] .STATUS直接指向[狀態] .STATUS
  2. 我添加ID列[狀態]表中,並使其PK /自動增量。然後[Employee] .Status指向[Status] .Id。這意味着我必須進行連接才能獲取狀態文本。

其他表也可能引用狀態表。兩種方法之一是「正確的」做事方式還是設計問題?

+0

選項2. maintanability更復雜的表格第三種選擇 - 爲下面回答說。 – RPM1984 2010-09-20 00:53:08

+1

幾個小時前偶然討論過的同一個主題:[關係數據庫設計問題 - 代理鍵或自然鍵?](http://stackoverflow.com/questions/3747730/relational-database-design-question-surrogate -key-or-natural-key) – 2010-09-20 00:58:27

+1

[主鍵的設計標準是什麼?](http://stackoverflow.com/questions/3632726/what-are-the-design-criteria-for-primary - 鍵) – APC 2010-09-20 01:03:51

回答

4

這基本上是一個設計問題,但通常更好的方法是在狀態表中添加一個ID字段。這使您可以更改狀態值(拼寫更正,語言翻譯,更改術語以澄清含義等),而無需更新引用它的表中的數據。

此外,如果鏈接到字符串字段,則鏈接字段需要足夠的空間來存儲最長的狀態字符串。鏈接到ID意味着你只需要在鏈接字段中存儲一個整數(或最壞的情況下,一個GUID)。

+0

完美,這正是我需要的。目前無法接受您的答案 - 5分鐘。 – Harper 2010-09-20 00:56:38

+1

如果Status基本上是一個具有少量值的靜態查找表,那麼您可能希望使用較小的數據類型作爲它的id,而不是像在Employee這樣的表中使用的那樣,您希望允許更多行。一個字節會有很多不同的狀態值。 – 2010-09-20 01:52:14

0

在要同時刪除記錄和更新名稱,而不會丟失參考會像

[Employee] Table: 
Id (Primary Key, Autoincrement) 
FirstName 
LastName 
StatusNumber 

[Status] Table: 
Id (PK) 
Number 
Name 
+0

我不明白你爲什麼建議從一個不屬於狀態表中的主鍵的字段加入Employee到Status?看起來像是一個多餘的領域,並且有錯誤的風險,沒有任何好處。因此,狀態表中的兩行可能具有相同的數字。如果您通過約束來阻止這種情況,那麼與僅使用Id相比,這有什麼不同? – 2010-09-20 01:48:45