2016-04-03 43 views
0

我想知道什麼時候可以表示一個實體集合和一個三元關係之間的關係?我理解聚合的好處,但是爲什麼在實體集合和關係集合之間沒有關係屬性時使用它?例如,一個研究生(有一個學生#和名字)在一個項目上工作(包括PID,開始日期和結束日期),並且每個學生工作的項目都有一名監督教授。每個項目必須只有一位教授擔任主管。主管關係沒有獨特的屬性,但我被告知應該使用聚合,但爲什麼?何時在RDBMS中使用三元關係而不是聚合?

回答

1

案例一,二元所有制每個項目只有一個學生和一個教授(1,1)(項目三元)

Student(sid,..) 
Professor(pid,..) 
Project(pid,sid,..) 

案例2中,每個項目都有不止一個學生和一個教授,各學生有一個項目。 (1,N)(在項目聚集學生三元)

Student(sid,pid,...) 
Professor(pid,..) 
Project(pid,..) 

案例3各項目可以具有一個以上的學生,並且每個學生可以具有一個以上的項目(N,N)(聚集體)

Student(sid,...) 
Professor(pid,..) 
Project(pid,..) 
StudentProject(pid,sud) //One entry for each student working on a project 

如果您被告知將聚合體用於沒有(N,N)關係的實體,這可能是一種面向未來的形式。

不同之處在於你應該在哪個表中存儲與項目的關係。

+0

也許更清楚的是,我問的是使用教授,作品和學生之間的三元關係。我有點困惑於你的回答 – prance

+0

ER圖必須映射到關係數據庫,我已經指定了3種不同的表格佈局。即使關係沒有任何屬性,關係也是成立的。聚合描述關係中的實體列表。如果僅存在關係的(1,1)映射,則它是無意義的聚合,因爲它可以表示爲所有權(情況1),如果(A,B)上的(1,N)存儲邊在表A中,如果它是(N,N)爲邊緣創建一個表。 – awiebe

+0

如果您被告知要使用聚合表,那可能是因爲他們預計未來的關係可能會變爲(N,N0)。 – awiebe

1

聚合不只是萬一有在關係的屬性,三元是在某些情況下更爲嚴格,生病用一個例子解釋:

比方說,你有用於在不同日期調度類小型數據庫在這些日期指定老師的課,用三元關係它看起來類似的東西:

ERD:https://i.stack.imgur.com/8FQ87.png

CREATE TABLE teacher 
{ 
    teacher_id int PRIMARY KEY 
} 

CREATE TABLE class 
{ 
    class_id int PRIMARY KEY 
} 

CREATE TABLE date 
{ 
    date_id int PRIMARY KEY 
} 

CREATE TABLE teaching_class_in_date 
{ 
    date_id int, 
    class_id int, 
    teacher_id, 
    constraint teaching_class_in_date_PK PRIMARY KEY (date_id,class_id,teacher_id) 
    constraint teacher_FK FOREIGN KEY (teacher_id) references teacher (teacher_id) 
    constraint class_FK FOREIGN KEY (class_id) references class (class_id) 
    constraint date_FK FOREIGN KEY (date_id) references date (date_id) 
} 

這意味着,當你想安排一個新的CL屁股與老師,你需要預先在老師,班級和日期三個記錄。但是如果你想在某個特定的日期首先分配一個班級,但是還不確定老師呢?

你有兩個選擇,我通常在一個凌亂的企業數據庫中看到的選項是在教師表中創建一個虛擬記錄,以在某個日期分配給每個新班級,如果你還不確定老師的話,它將在GUI中顯示爲「默認」或「空白」。 選項二,使teacher_id不是主鍵的一部分,並允許給teacher_id外鍵使用空值。

這兩個都是不好的決定,第二個更糟,因爲它打破了數據庫的第三範式。

爲了解決這個問題,你可以使用聚合這樣的:

ERD:https://i.stack.imgur.com/wAEXF.png

所以,現在你有一個額外的表:

CREATE TABLE class_in_date 
{ 
    date_id int, 
    class_id int, 
    constraint class_in_date_PK PRIMARY KEY (date_id,class_id) 
    constraint class_FK FOREIGN KEY (class_id) references class (class_id) 
    constraint date_FK FOREIGN KEY (date_id) references date (date_id) 
} 

現在,您可以指定兩個,而不必擔心關於老師。這一切都歸結爲要求,如果我沒有創造要求在沒有老師的情況下在某個特定日期分配班級,那麼三元關係就足夠了。

希望這有助於!