Aconsejaría ir con una relación típica de muchos a muchos entre mensajes y etiquetas.
Eso significaría que necesita 3 mesas.
Messages
(columnasId
,UserId
yContent
)Tags
(columnasId
yTagName
)TagMessageRelations
(columnas:MessageId
yTagId
- para hacer las conexiones entre mensajes y etiquetas - a través de claves externas que apuntan aMessages.Id
/Tags.Id
)
De esa manera, no almacena una etiqueta varias veces, sino que solo crea una nueva relación con un mensaje (si esa etiqueta ya existe en la tabla de etiquetas, por supuesto).
De esta manera puedes
- fácilmente cuenta cuántas etiquetas hay (
SELECT COUNT(*) FROM Tags
) - guardar cada etiqueta solo una vez y la búsqueda de etiquetas se puede indexar fácilmente
- o cuente cuántas veces se usó una determinada etiqueta por usuario, por ejemplo:
SELECT
COUNT(*)
FROM Tags
INNER JOIN TagMessageRelations ON Tags.Id = TagMessageRelations.TagId
INNER JOIN Messages ON TagMessageRelations.MessageId = Messages.Id
GROUP BY Messages.UserId