2013-10-14 122 views
1

我只是有一個簡單的問題。一張表是否只有主鍵作爲外鍵?外鍵可以唯一主鍵

澄清。當我創建表時,我有時會有一個帶有多個鍵的表,其中一些是外鍵。例如:

create table Pet(
Name varchar(20), 
Owner char(1), 
Color varchar(10), 
primary key(Name, Owner), 
foreign key(Owner) referecnes Person(Ssn) 
); 

所以現在我想知道是否有可能做這樣的事情:

create table WorksAs(
Worker char(1), 
Work varcahr(30), 
primary key(Worker), 
foreign key(Worker) references Person(Ssn) 
); 

這將導致在具有完全相同的主鍵兩個表。這是應該避免的還是設計數據庫的好方法?如果上述不是一個好的標準,我只是簡單地將Work變量設置爲主鍵,這樣可以,但是如果不需要,跳過它似乎更簡單。

+0

我覺得你的表WorkAs應該是一個關係表的空間。這意味着您可以使用WorkPlaces的表格,例如帶有Workers和Table WorksAs的表格與Worker-> WorkPlace建立關係。否則,爲什麼你不使用同一個表(Worker)並且將該列添加到char Workplace中? 但回答你的問題,是的,你可以擁有它。 –

+0

我會說它非常好。但是......爲什麼不直接將這些字段(在WorksAs中)移動到Person表中(在那裏可以爲空)?少一桌。少加入一個。 –

+0

首先,這只是我提出這個問題時遇到的一個不好的例子,因爲解釋我想知道的更容易。其次,我想知道這個的原因是因爲我正在處理一個任務,我們應該從我們的數據庫中消除NULL值。所以,如果我把人工表格中的WorksAs我會有可能的NULL值,我不想要的問題:) –

回答

1

是的。由於以下原因。

  1. 使它們成爲主鍵將強制唯一性(而不是暗示它)。
  2. 主鍵可能會被聚集(取決於dbms),這會提高某些查詢的性能。
  3. 它可以節省加入了獨特的約束在某些DBMS還創建唯一索引
1

是的,你可以這樣做。但是你需要小心,因爲外鍵可以有NULL值,而Primary不能。

+0

雖然這確實如此,但OP特別詢問「表可以只有主鍵作爲外鍵嗎?」,所以我猜(他)他也會向細節表添加一個主鍵約束。 –

+0

夠公平..但是我自己在mysql的時候,我首先想到的是,Jesper可能會面臨NULL值的問題,結果證明這是正確的。 –