2009-09-24 2 views
2

Parfois plus d'un artiste sera sur une chanson. Par exemple, la nouvelle chanson de Jay-z "A Star is Born" met en vedette l'artiste Cole, et serait ainsi répertorié comme "Jay-z (mettant en vedette Cole) - A Star is Born" dans un catalogue. Ma question est comment modéliser ceci dans ma base de données.Comment modéliser le concept de "Featuring" (c'est-à-dire, quand un artiste est "en vedette" sur une chanson)

En ce moment, c'est assez simple: chaque chanson belongs_to :artist et tous les artistes has_many :songs. Je veux changer cela afin que les chansons aient beaucoup d'artistes, avec un artiste spécifié comme «primaire» - c.-à-d. Si A, B et C sont tous associés à une chanson donnée et A est primaire, l'artiste de cette chanson sera affiché comme "A (avec B et C)".

Voici ce que je pense:

chanson:

has_many :artists, :through => :performances 

Artiste:

has_many :songs, :through => :performances 

où le modèle performance aurait un seul champ pour primary?, désignant si une performance donnée était la performance "primaire" sur la chanson, ce qui signifie que l'artiste associé à cette performance est l'artiste principal de la chanson.

Cette approche a-t-elle un sens?

Répondre

1

Il semble que vous utilisiez des performances en tant que table de jointure avec des informations supplémentaires pour lier des chansons à des artistes. Mais cela ne fonctionne pas assez bien. Les chansons peuvent avoir de nombreuses performances, et chaque performance peut avoir plusieurs interprètes.

Je restructurerais la base de données pour utiliser la structure suivante. Malheureusement, il faudrait un peu plus de travail pour ajouter un morceau à la base de données, mais permet des reprises, des versions multiples de la chanson et des duos.

Song (Attributs: Titre)

  • a de nombreux spectacles
  • a de nombreux artistes interprètes ou exécutants (à travers des performances)
  • a de nombreux artistes (par artistes interprètes ou exécutants)

Performance (Clé étrangère: Song_id, Attributs: Date, Année, Durée, Genre, Album,)

  • appartient Song
  • a de nombreux artistes interprètes ou exécutants
  • a de nombreux artistes (par artistes interprètes ou exécutants)

artistes interprètes ou exécutants (clés étrangères: Performance_id, Artist_id, Attributs: Rôle)

  • a un morceau (par l'intermédiaire des artistes interprètes ou exécutants) NBhas_one: par n'est pas une caractéristique essentielle de Rails
  • appartient à Performances
  • appartient à l'artiste

Artiste (Attributs: nom, date de naissance, etc. (autres inforamtion personnelles))

  • a de nombreux artistes interprètes ou exécutants
  • a de nombreux spectacles (par artistes interprètes ou exécutants)
  • a beaucoup de chansons (à travers des performances)

Si vous vouliez appliquer 1 artiste/performance primaire, cela serait fait comme validation dans Performers.

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