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
,UserId
eContent
)Tags
(colunasId
eTagName
)TagMessageRelations
(colunas:MessageId
eTagId
- 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