1

我已經分解了跟蹤員工的關係以及他們在酒店工作的時間。原來的關係如下這些表是否在第三範式?

R(national insurance number, contract Number, hours, eName, hotel Number,  hotel Location) 

改寫爲

R(A, B, C, D, E, F) 

我已經找到了函數依賴

F:(A->D, E->F, AB->C, B->E, BA->E) 

從這個我已經創建了以下三個表格

1. 
Employees: 
national insurance number(A) 
eName(D) 
PRIMARY KEY(A) 


2. 
Works at: 
contract Number(B) 
Hours(C) 
national insurance number(A) 
PRIMARY KEY(B, AND A) 

3. 
Hotel: 
contract Number(B) 
hotel Number(E) 
hotel Location(F) 
PRIMARY KEY(B) 

在我的第三張表中,我有一個主鍵,可以確定酒店的數量和位置。但酒店號碼也可以確定酒店 的位置。我應該將酒店位置移動到一張只有酒店號碼的新桌子嗎?那會佔用更多的空間,但是有必要達到3RD標準嗎?

+1

是表同一合同號「在作品的合同編號在「酒店」表? –

+0

我希望合同能成爲自己的表格,將工作人員與合同關聯起來。如果一家酒店只能擁有一個合同,那麼合同編號將在酒店中,但合同到期或酒店可能擁有多個合同的情況如何。在這種情況下,將會有一個管理這些條款的酒店 - 合同鏈接表。 –

+0

在任何情況下,您的合同號碼似乎不太可能是您酒店餐桌中的PK。 –

回答

1

當您假設您推導出的FD是正確和完整的,爲了在您的設置中達到第三範式,必須將Hotel(B,E,F) { B->E, E->F }分爲HotelContract(B,E) { B->E }Hotel(E,F) { E->F }。 形式上,在{ B->E, E->F }中,B是(唯一)密鑰,E是「非首要」屬性(即不是任何密鑰的一部分),因此F通過非密鑰屬性傳遞依賴於密鑰。這違反了第三範式。

對於違反3NF的模式Hotel(B,E,F) { B->E, E->F },您將得到一個「刪除異常」,即您從Hotel刪除元組時丟失了更多信息。假設的Hotel以下擴展名:

Hotel 
B | E | F 
---|---|--- 
b1 | e1| f1 
b2 | e2| f2 

當你刪除的元組(b2,e2,f2),那麼你失去的是酒店e2位於f2的信息,儘管你只是想刪除的合同。

更糟糕的是,當你計劃翻譯成

Hotel: 
contract Number(B) 
hotel Number(E) 
hotel Location(F) 
PRIMARY KEY(B) 

,那就可以忽略FD E->F,這將允許該同一酒店e1得到兩個不同的位置,例如f1f2

Hotel 
B | E | F 
---|---|--- 
b1 | e1| f1 
b2 | e1| f2 -> permitted by your scheme, but not intended! 

因此,按照介紹中的建議拆分表格。

1

看起來你是對的。酒店需要放在單獨的桌子上。

另外我猜測員工有可能在多家酒店工作多個合同,而且一家酒店可能會爲員工提供一個以上的合同。

所以,我規範化的形式將類似於:

1. Employees: 
    national insurance number(A) 
    eName(D) 
    PRIMARY KEY(A) 

2. Hotels: 
    hotel Number(E) 
    hotel Location(F) 
    PRIMARY KEY(E) 

3. Contracts: 
    contract Number(B) 
    hotel Number(E) 
    PRIMARY KEY(B) 
    FOREIGN KEY(Hotels.E) 

4. Works at: 
    work at(G), 
    national insurance number(A) 
    contract Number(B) 
    Hours(C) 
    PRIMARY KEY(G) 
    FOREIGN KEY(Employees.A) 
    FOREIGN KEY(Contracts.B) 
+0

規範化不會引入新的列名稱。另外,你被告知* FD是什麼,所以你的「猜測有可能」是不合適的。 – philipxy