2010-04-22 20 views
4

J'ai ceci:Dois-je dénormaliser un has_many has_many?

class User < ActiveRecord::Base 
    has_many :serials 
    has_many :sites, :through => :series 
end 

class Serial < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :site 
    has_many :episodes 
end 

class Site < ActiveRecord::Base 
    has_many :serials 
    has_many :users, :through => :serials 
end 

class Episode < ActiveRecord::Base 
    belongs_to :serial 
end 

Je voudrais faire quelques opérations sur User.serials.episodes mais je sais que cela signifierait toutes sortes de trucs intelligents. En théorie, je pourrais simplement mettre toutes les données de l'épisode en série (dénormaliser) et ensuite en groupe si nécessaire.

Si j'ai beaucoup d'épisodes que j'ai besoin de demander ce serait une mauvaise idée?

merci

Répondre

0

Je ne prendrais pas la peine de dénormaliser.

Si vous avez besoin de regarder les comptes, vous pouvez vérifier counter_cache sur la relation pour enregistrer les requêtes pour cela.

Avez-vous des index appropriés sur vos clés étrangères? Si oui, en tirant les données d'un supplémentaire joindre ne devrait pas être un gros problème, mais vous pourriez avoir besoin de descendre à SQL pour obtenir tous les résultats dans une requête sans itérer .serials:

User.serials.collect { |s| s.episodes }.uniq # ack! this could be bad 
0

Cela dépend vraiment de l'échelle dont vous avez besoin pour cette application. Si l'application n'a pas besoin de servir des tonnes et des tonnes de gens, alors allez-y. Si vous obtenez beaucoup d'avantages des associations d'enregistrements actifs, alors allez-y et utilisez-les. Au fur et à mesure que votre application évolue, vous pouvez remplacer des instances spécifiques de l'association par une approche plus directe pour gérer votre trafic.