Podstawą jest to, że musisz przechowywać tagi, tak jak pokazujesz w pierwszym przypadku. Jest to dobre do sprawdzenia, czy tag istnieje (ponieważ w drugim przypadku dla istniejących tagów Twoja baza danych zwróci tyle wierszy, ile jest tych wystąpień tagu) i dobra do pobierania elementów według tagu (wybierz id elementu za pomocą jednego identyfikatora tagu jest lepsze niż wybieranie elementu id przez zestaw tag_id, który ma takie samo znaczenie reprezentacyjne).
Jeśli poparzyłeś sobie palce z powodu indeksowania - zawsze powinieneś sprawdzić jak wykonywane jest zapytanie (dla mysql jest to EXPLAIN/DESCRIBE SELECT
).