2010-11-26 45 views
0

這是我的第一個問題stackoverflow,所以如果我做錯了請讓我知道我會盡快修復它。方法爲電視節目創建數據庫

所以我想製作一個數據庫電視節目,我想知道最好的方法,並使我當前的數據庫更簡單(規範化)。

我會能夠有以下結構或類似。

Fringe 
     Season 1 
      Episodes 1 - 10(whatever there are) 
     Season 2 
      Episodes 1 - 10(whatever there are) 
     ... (so on) 

    Burn Notice 
     Season 1 
      Episodes 1 - 10(whatever there are) 
     Season 2 
      Episodes 1 - 10(whatever there are) 
     ... (so on) 

    ... (More Tv Shows) 

對不起,如果這似乎不清楚。 (請要求澄清)

但結構我現在所擁有的是3個表(tvshow_list,tvshow_episodes,tvshow_link)

//tvshow_list// 
    TvShow Name | Director | Company_Created | Language | TVDescription | tv_ID 

    //tvshow_episodes// 
    tv_ID | EpisodeNum | SeasonNum | EpTitle | EpDescription | Showdate | epid 

    //tvshow_link// 
    epid | ep_link 

主任和該公司是由一個ID鏈接到另一個表列表的公司和董事。

我很確定這樣做有一個更簡單的方法。

感謝提前的幫助下,
Krishanthan Lingeswaran

+1

另一張表的公司和董事名單的結構是什麼?什麼是tvshow_link表格? – YWE 2010-11-26 18:15:16

+0

@YWE:我認爲這是因爲o0Kris0o想要將用戶鏈接到他們可以在線觀看或購買劇集的地方。 – 2010-11-26 19:33:03

回答

1

規範化的基本概念是,你應該只存儲你的數據的任何項目的一個副本的想法。看起來你已經有了一個好的開始。

有兩種基本的方法來模擬你想要在這裏做什麼,包括劇集和節目。在數據庫領域,我們可能聽說過「一對多」或「多對多」這個詞。兩者都是有用的,它只是取決於你的具體情況,以知道哪個是正確的使用。就你而言,問自己的一個大問題是,一集只能屬於一個節目,還是一個節目可以同時屬於多個節目?我將解釋這兩種形式,以及爲什麼你需要知道這個問題的答案。

第一種形式僅僅是一種外鍵關係。如果在劇集表格中有兩個表格「episodes」和「shows」,則會有一個名爲「show_id」的列,其中包含一個(且只有一個!)節目的ID。你能否看到你怎麼可能永遠不會有這樣一個節目屬於多個節目?這被稱爲「一對多」關係,即節目可以有很多集。

第二種形式是使用關聯表,這是您在示例中使用的表單。這種形式可以讓你將一集與多個節目相關聯,因此被稱爲「多對多」關係。

使用第一種形式有一些好處,但在大多數情況下並不是什麼大事。您的查詢將會縮短一點,因爲您只需加入兩張表即可獲取劇集 - >節目,但其他表只是一個加入節目。這真的歸結爲要弄清楚你是否需要「一對多」或「多對多」的關係。

您需要多對多關係的情況的一個示例是,如果您正在爲圖書館建模,並且必須跟蹤誰檢出了哪本書。你需要一張書籍表,一張用戶表,然後是一張「書籍給用戶」的表格,這些表格有一個ID,一個book_id和一個user_id,並且是一個多對多的關係。

希望有幫助!

1

我非常肯定,有一個更簡單的方法來做到這一點。

據我所知。您的模式接近於您所要求的功能所能達到的最簡單的模式。對它的「改進」實際上只會使它變得更加複雜,並且應該在您判斷需求出現在您身邊時添加。下面的例子讓人想起(其中沒有一個真正簡化你的模式)。

  • 我會標準化您的外鍵和主鍵名稱。一個例子是將列shows.id, episodes.id, episodes.show_id, link.id, link.episode_id
  • SeasonNum作爲我認爲在Episodes表中的int,在我看來,違反了規範化約束。這不是一個嚴重的違規行爲,但是如果你真的想堅持下去,我會創建一個單獨的Seasons表並將它多對一地關聯到Shows表,然後讓這些Episodes僅與Seasons結合。這給你提供了一個機會,例如,爲每個季節添加信息。此外,它防止重複信息(雖然Episodes表中的季節ID外鍵列的類型表面上仍然是一個INT,外鍵在哲學上存儲一個關聯,你想要什麼,與啞數據,你有什麼)。
  • 您可能會考慮將語言,導演和公司放在自己的表格中,而不是您的電視節目列表中。這與上述情況一樣,在你的情況下,對正常化的輕微違反。
  • 語言,總監和公司都對他們關於協會的級別有一些有趣的問題。大多數電視節目對於不同的劇集都有不同的導演。許多是由多種語言和幾個不同的公司,有時網絡。那麼你打算在什麼層次上存儲這些信息呢?我不是一個軟件架構師,所以別人可以比我更好地回答這個問題,但我會爲語言,導演和公司建立一個多態多對多關聯,並建立允許這些值的繼承模型按照每集,每個季節或逐個展示的方式指定,如果沒有提供,則繼承其父項的值。

關於所有這些建議的底線:選擇適合您項目的項目。如果您不需要這種級別的關聯提供的功能,並且您不介意手動輸入重複數據(您可能最終實現自動完成系統來幫助您),那麼您可以忽略一些規範化限制。

標準化僅僅是一個建議。選擇適合自己的方式,並從錯誤中學習。