Eu aconselharia usar um relacionamento típico de muitos para muitos entre mensagens e tags.
Isso significa que você precisa de 3 tabelas.
Messages(colunasId,UserIdeContent)Tags(colunasIdeTagName)TagMessageRelations(colunas:MessageIdeTagId- fazer as conexões entre mensagens e tags - via chaves estrangeiras apontando paraMessages.Id/Tags.Id)
Dessa forma, você não armazena uma tag várias vezes, mas apenas cria uma nova relação com uma mensagem (se essa tag já existir na tabela de tags, é claro).
Desta forma você pode
- facilmente conta quantas tags existem (
SELECT COUNT(*) FROM Tags) - salve cada tag apenas uma vez e a pesquisa de tags pode ser facilmente indexada
- ou contar quantas vezes uma determinada tag foi usada por usuário - por exemplo:
SELECT
COUNT(*)
FROM Tags
INNER JOIN TagMessageRelations ON Tags.Id = TagMessageRelations.TagId
INNER JOIN Messages ON TagMessageRelations.MessageId = Messages.Id
GROUP BY Messages.UserId