2010-10-05 9 views
1

J'ajoute des étiquettes à plusieurs modèles (articles, articles, photos, etc.). Je connais les rails qui marquent les plugins mais je préfère ne pas les utiliser, car ils ne répondent pas vraiment à mes besoins spécifiques.Ajout d'étiquettes à des modèles polymorphes dans des rails

Je sais que la façon typique d'implémenter le support de marquage polymorphique est d'utiliser 2 tables Tags, Taggings et de configurer les has_many: through relations appropriées. Mais, comme j'y pense un peu plus - et voici ma question: Y at-il un besoin pour une table de Tags. Y at-il des inconvénients de l'utilisation juste une table et ont mes marquages ​​relations comme celle-ci:

Post, Article, Photo 
has_many :taggings 

Taggings (attributes) 
taggable_type 
taggable_id 
tag_name 

alors je juste besoin de gérer l'insertion/suppression de me marquages. Fondamentalement, je voudrais simplement stocker l'attribut tag_name directement dans la table Taggings au lieu d'une table Tags.

Les avantages sont d'éliminer la gestion d'une table, pas de jointures pour obtenir les noms de balises (même si je vais faire beaucoup de SELECT DISTINCT).

Pourriez-vous me faire savoir votre avis sur ce design?

Merci.

Répondre

1

Ces SELECT DISTINCT vont être un inconvénient. Vous allez trouver lent à construire une liste de balises, pas seulement dans le cas de la construction d'un index à lier (que vous pourriez contourner par la mise en cache de fragments, je suppose) mais aussi pour l'auto-complétion. Je dirais que l'inconvénient le plus important est que si vous utilisez une solution de recherche dans l'application (par exemple Xapian), vous devrez soit indexer la table Taggings, ce qui est susceptible de créer des résultats étranges, ou pas d'index du tout, ce qui pourrait vaincre le point de tags, selon la façon dont vous les utilisez.

Aucun de vous ne devrait absolument pas le faire, bien sûr; sauter la jointure supplémentaire va rendre certaines choses beaucoup plus rapidement. C'est intelligent de voir le coût et de décider si ça en vaut la peine.