Radziłbym zastosować typową relację wiele-do-wielu między wiadomościami a tagami.
Oznaczałoby to, że potrzebujesz 3 stołów.
Messages
(kolumnyId
,UserId
iContent
)Tags
(kolumnyId
iTagName
)TagMessageRelations
(kolumny:MessageId
iTagId
- 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