Consiglierei di adottare una tipica relazione molti-a-molti tra messaggi e tag.
Ciò significherebbe che hai bisogno di 3 tabelle.
Messages
(colonneId
,UserId
eContent
)Tags
(colonneId
eTagName
)TagMessageRelations
(colonne:MessageId
eTagId
- per effettuare le connessioni tra messaggi e tag - tramite chiavi esterne che puntano aMessages.Id
/Tags.Id
)
In questo modo non memorizzi un tag più volte ma crei solo una nuova relazione con un messaggio (se quel tag esiste già nella tabella dei tag, ovviamente).
In questo modo puoi
- Conta facilmente quanti tag ci sono (
SELECT COUNT(*) FROM Tags
) - salva ogni tag una sola volta e la ricerca di tag può essere facilmente indicizzata
- o conta quante volte è stato utilizzato un determinato tag per utente, ad esempio:
SELECT
COUNT(*)
FROM Tags
INNER JOIN TagMessageRelations ON Tags.Id = TagMessageRelations.TagId
INNER JOIN Messages ON TagMessageRelations.MessageId = Messages.Id
GROUP BY Messages.UserId