2014-03-25 110 views
0

我正在創建電影信息數據庫,但堅持設計1電影與其他電影之間的關係表。電影關係數據庫設計

例如:復仇者是復仇者2的前傳,但我應該存儲在我的數據庫反向關係(續集)?我應該將關係分解爲分離的表格嗎?目前我有3個選擇,但這是設計數據庫的最佳實踐嗎?

選擇1:兩個表對關係存儲在關係映射內

Movies: id, title, ... 
Relation_maps: id, movie_id, related_movie_id, relation_text, reverse_relation_text 

所以,如果我有2部電影:復仇者和復仇者2.我有一個relation_text關係映射的「前傳」和反向的「續集」

備選2關係文本:分割成關係分隔的表,並存儲相反的關係作爲表本身

的一個id
Movies: id, title, ... 
Relation_maps: id, movie_id, related_movie_id, relation_id 
Relations: id, reverse_relation_id (self-refer to id), relation_text 

關係文本,將被存儲在另一個表中存儲作爲自參照ID相反的關係。因此,在關係表,它會變成這個樣子:

id | reverse_relation_id | relation_text 
    1 | 2     | prequel 
    2 | 1     | sequel 

方案3:拆分成關係分隔的表和反向關係,將通過有條件的代碼所示

Movies: id, title, ... 
Relation_maps: id, movie_id, related_movie_id, relation_id 
Relations: id, relation_text 

同樣的,替代2,除非反向關係將通過視圖代碼中的條件語句顯示。如果這樣更好,我應該真的分割關係文本還是將它合併到relation_maps表中?

是否有在性能和最佳實踐方面沒有更好的方法?提前致謝。

回答

0

也許是這樣的:

Relations 

id  name 
1  Star Wars 


Relations_Detail 

relation_id movie_id relation_type sequence 
      1  40 prequel     0 
      1  50 prequel     1 
      1  60 prequel     2 
      1  10 debut     3 
      1  20 sequel     4 
      1  30 sequel     5 

您將有(relation_id,movie_id)多列主鍵。

+0

我並沒有真正明白你的意思。爲什麼關係表與僅有電影名稱的電影表相同?訂單用於什麼? – deka

+0

@deka,你將要命名關係,並且不能使用自動增量在細節表中創建新的id,但可以在關係表中使用自動增量。此外,「序列」列允許您按順序列出電影。 –

+0

哦,我現在明白了。反向關係如何?例如在你的情況下,如果movie_id 40是星球大戰,而movie_id 50是星球大戰2?我想,如果我這樣使用它,會有太多的關係細節和冗餘。 – deka