2013-04-21 64 views
1

我簡單的例子可以是這個。我有電影表,電影有導演和演員。在我的數據庫中,電影可以有一個或多個導演和一個或多個演員。我也有一張桌子有人的信息的人。因此,一個人可以在電影中扮演不同的角色,我有其他具有角色扮演角色的桌子角色。這是最好的選擇,三元關係還是兩個二元?

在很多情況下,我會對知道電影導演或演員感興趣,所以我可以通過兩種主要方式來實現表格。

第一種選擇:三元關係:

Movies(IDMovie, ...) 
Persons(IDPerson, ...) 
Roles(IDRol,...) 
MoviesPersons(IDMovie, IDPerson, IDRol...) 

在這種情況下,我使用的三元關係。

第二個選項是:

MoviesDirectors(IDMovie, IDPerson,...) 
MoviesActors(IDMovie, IDPerson,...) 

在這種情況下我可以推斷從關係表把rol。

哪一個是最好的選擇?

謝謝。

編輯:如果我使用兩個二元關係的選項,如果將來如果我想要有配樂的作曲家,我需要創建一個新的表格和關係,但是,與三元關係我不喜歡不需要做任何事情,只需在表中添加新的角色和其他任何東西。

在性能是更好的兩個二元關係,而不是一個三元關係?

謝謝。

回答

1

哪一個是最好的選擇?

你幾乎回答了你自己的問題 - 如果你想在不改變數據庫結構的情況下增加新角色的靈活性,那麼三元關係就是要走的路。

我會考慮單獨的二元關係,如果他們每個人都需要有不同的領域或約束(從您的描述中似乎並不是這種情況)。

在性能更好的兩個二元關係,而不是一個三元關係?

因爲代表三元關係表需要物理存儲的角色標識符(而不是其中的角色從表名稱本身推斷二元關係),緩存的使用會稍微更糟。

但是,通過仔細排序組合PK中的字段,可以使三元關係更適合於某些類型的查詢。例如,PK:{IDMovie, IDRol, IDPerson}可以有效地支持以下查詢:

  • 哪些人在給定的電影上工作?(X)
  • 哪個人在特定角色的電影中工作過?

如果創建一個索引:{IDPerson, IDRol, IDMovie},你也將能夠爲高效地查詢:

  • 哪些電影已經給定的人工作過? (X)
  • 哪個電影有給定的人在給定的角色工作?

(X)設有獨立的二元關係,你需要查詢每個路口表。這對於兩張表格肯定不是問題,但隨着表格數量的增加(當然可以從維護甚至從性能點)可以成爲一個問題。