Radziłbym zastosować typową relację wiele-do-wielu między wiadomościami a tagami.
Oznaczałoby to, że potrzebujesz 3 stołów.
Messages(kolumnyId,UserIdiContent)Tags(kolumnyIdiTagName)TagMessageRelations(kolumny:MessageIdiTagId- aby tworzyć połączenia między wiadomościami i tagami - poprzez obce klucze wskazujące naMessages.Id/Tags.Id)
W ten sposób nie przechowujesz znacznika wiele razy, a jedynie tworzysz nową relację do wiadomości (oczywiście, jeśli ten znacznik już istnieje w tabeli znaczników).
W ten sposób możesz
- łatwo policzyć, ile tagów są (
SELECT COUNT(*) FROM Tags) - zapisz każdy tag tylko raz a wyszukiwanie tagów może być łatwo indeksowane
- lub policzyć, ile razy dany tag został użyty na użytkownika - na przykład:
SELECT
COUNT(*)
FROM Tags
INNER JOIN TagMessageRelations ON Tags.Id = TagMessageRelations.TagId
INNER JOIN Messages ON TagMessageRelations.MessageId = Messages.Id
GROUP BY Messages.UserId