2010-04-09 62 views
1

我有關於規範化的問題。 假設我有一個處理歌曲的應用程序。mySQL和通用數據庫規範化問題

首先,我想過做這樣的:

Songs Table: 
id | song_title | album_id | publisher_id | artist_id 

Albums Table: 
id | album_title | etc... 

Publishers Table: 
id | publisher_name | etc... 

Artists Tale: 
id | artist_name | etc... 

然後我想正常化的東西。我想我應該擺脫「album_id,PUBLISHER_ID和artist_id在歌曲表,並把他們在這樣的中間表。

Table song_album: 
song_id, album_id 

Table song_publisher 
song_id, publisher_id 

Table song_artist 
song_id, artist_id 

現在我不能決定哪個是更好的辦法。我不是在數據庫設計專家,所以如果有人想指出正確的方向。它會真棒。

是否有任何性能問題兩種方法之間?

感謝

回答

3

忘掉性能問題。問題是這個模型是否正確表示數據?

中間表稱爲「聯結表」,它們在您可以具有多對多關係時非常有用。例如,如果您將歌曲「我們是世界」存儲在您的數據庫中,那麼您將擁有該歌曲的許多藝術家。這些藝術家中的每一個也都負責製作許多其他歌曲。因此,爲了正確表示數據,您必須使用聯結表,就像您在第二個版本中所做的那樣。

2

那要看情況。如果你能保證是某個特定歌曲總是屬於單一專輯,去你的第一個方法。如果沒有,你有n對n的關係,需要一個連接表:這是你的第二種方法。就規範化而言,兩者都完全沒問題。

設計數據庫非常重要,您可以將數據映射到該數據庫。

不要擔心這裏的表現。性能更多依賴於如何優化索引以及查詢的樣子,而不是必須再進行一次連接操作(您的第二種方法即連接表在每個查詢中需要多一次連接)。

-3

我會堅持與第一個,有兩個原因:

  1. 一首歌曲只用了一張專輯,一個出版商,一個藝術家相關聯,因此您無需爲他們創造不同的表(例如,如果一首歌曲可以有多個藝術家,則創建song_artist表格)。
  2. 它更有效率。採用第二種方法,您需要進行一些連接。
+0

只是出於好奇,爲什麼-1? – yassin 2010-04-09 20:58:44

0

歌曲可以出現在多個相冊中。認爲一個最大的命中版本。對於縮小技術漏洞並考慮應用程序(或數據庫)的真實世界使用而言,它非常重要。

+1

取決於設計。一個可能的設計決定可能是不讓歌曲出現在多個專輯中,出於某些原因......也許這首歌是重新安裝在最大的熱門版本上,而你不想將它與原版相關聯。也許你想忽略_really_出現在不同專輯上的那幾首歌曲?重要的是:在設計時,必須在使用數據庫之前考慮這些事情。 – 2010-04-09 15:47:15

1

第一種結構混合了語義(例如,爲每首單曲寫出發行者姓名)。第二種結構將允許您將無效數據放入數據庫中(例如,一首歌曲可以屬於兩個專輯)。以下是我從問題域的理解和我的設計建議:

一個專輯僅由一個出版商出版,因此你不需要在每一個歌曲只需指定發佈者,你需要將publisher_ID放入相冊表。另外,如果您將artist_ID保存在歌曲表中,則每首歌曲一次只能有一個歌手;但通過將song_IDartist_ID放在鏈接表中,您可以爲一首歌曲創建多個藝術家(例如兩個歌手一起唱一首歌曲的時間)。 publisher_id轉到專輯表由於每個專輯由一個發佈者發佈。 對於表名,總是建議使用單數形式。

這裏是我的設計建議:

Song Table: 
id | song_title | album_id | ... 

Album Table: 
id | album_title | publisher_id | ... 

Publisher Table: 
id | publisher_name | ... 

Artist Table: 
id | artist_name | ... 

Song_Artist Table: 
song_id | artist_id | artist_role | ...