Les bases sont que vous devez stocker les balises comme vous le montrez dans le premier cas. C'est bon pour vérifier si la balise existe (puisque dans le second cas pour les balises existantes, votre base de données renverrait autant de lignes qu'il y a ces apparitions de balise) et bon pour récupérer les éléments par balise (sélectionner l'ID de l'élément par un ID de balise est préférable que de sélectionner l'élément ids par un ensemble de tag_id qui a la même signification de représentation).
Si vous vous êtes brûlé les doigts à cause de l'indexation - vous devriez toujours vérifier comment la requête est exécutée (pour mysql c'est EXPLAIN/DESCRIBE SELECT
).