2009-09-24 15 views
2

有時,歌曲上會出現不止一位藝術家。例如,Jay-z的新歌曲「A Star is Born」以藝術家Cole爲特色,因此在目錄中被列爲「Jay-z(特色Cole) - 星星誕生」。我的問題是如何在我的數據庫中建模。如何爲「特色」概念建模(即,當某首歌曲「有特色」時)

現在這很簡單:每首歌曲belongs_to :artist和每個藝術家has_many :songs。我想改變這一點,以便歌曲有許多藝術家,一位藝術家被指定爲「主要」 - 即,如果A,B和C都與給定歌曲相關聯,並且A是主要歌手,則該歌曲的藝術家將成爲顯示爲「A(具有B和C)」。

這裏就是我想:

宋:

has_many :artists, :through => :performances 

藝術家:

has_many :songs, :through => :performances 

其中performance模式將有一個字段爲primary?,指定是否給定的性能是這首歌的「主要」表演,這意味着與該表演相關的藝術家是該歌曲的主要藝術家。

這種方法有意義嗎?

回答

1

它看起來像你使用表演作爲一個連接表,添加信息將歌曲鏈接到藝術家。但是這不夠好。歌曲可以有許多表演,每個表演可以有多個表演者。

我會重構數據庫以使用以下結構。不幸的是,它需要更多的工作才能將歌曲添加到數據庫,但允許使用封面,歌曲的多個版本以及二重奏。

歌(屬性:名稱)

  • 有許多表演
  • 有許多表演者(通過演出)
  • 有很多藝術家(通過表演)

性能(外鍵:Song_id,屬性:日期,年份,長度,流派,專輯)

  • 屬於宋
  • 有許多表演
  • 有很多藝術家(通過表演)

表演(外鍵:Performance_id,Artist_id,屬性:角色)

  • 有一首歌曲(通過演員)NBHAS_ONE:通過不是Rails的
  • 核心功能屬於表演
  • 屬於藝術家

藝術家(屬性:姓名,出生等。(其它個人inforamtion)的日期)

  • 有許多表演
  • 有許多性能(通過表演者)
  • 有許多歌曲(通過演出)

如果你想強制執行1個主要藝術家/表演,它將在表演者中進行驗證。

class Performers < ActiveRecord::Base 
    validates_uniqueness_of :role, :scope => [:performance_id], :if => Proc.new{|performer| performer.role == "primary"} 
end 
相關問題