mysql normalization hashtag

mysql - Diseño de bases de datos para aplicaciones utilizando “hashtags”.



normalization (1)

pregunta de diseño de base de datos aquí.

Supongamos que tenemos una aplicación web o algo que utiliza hashtags para notas de 20 a 40 palabras. ¿Cuál es la mejor manera de almacenar los hashtags de un usuario.

Por ejemplo, si un usuario entra. "I like to have #lunch at #sizzler" almacenaríamos la oración como texto y podríamos almacenar los hashtags como JSON, una lista separada por comas o algún otro mecanismo.

También vale la pena señalar que las etiquetas deben poder buscarse, por ejemplo, cuántas personas han etiquetado el hash en el almuerzo, etc.

Asesorar sobre el tema sería genial, siempre me siento un poco perplejo cuando se trata de almacenar entradas de tamaño variable en mysql. Puede haber un número infinito de hashtags por nota, ¿cuál es la mejor manera de almacenarlos?


Recomendaría ir con una relación típica de muchos a muchos entre mensajes y etiquetas.

Eso significaría que necesitas 3 mesas.

  • Una tabla para los messages sí (requisito mínimo: ID columnas, ID UserID y message-content )
  • Una tabla para las tags (el requisito mínimo aquí es: ID columnas y tag-name )
  • Y una última tabla tagMessagesRelations para realizar las conexiones entre mensajes y etiquetas (a través de las claves foráneas messageID y tagID )

De esa manera, no almacena una etiqueta varias veces, solo crea una nueva relación con un mensaje (si esa etiqueta ya existe en la tabla de etiquetas, por supuesto).

Eso entonces te permite

  • Cuenta fácilmente cuántas etiquetas hay ( SELECT COUNT(*) FROM tags )
  • solo guardará cada etiqueta 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 tagMessagesRelations ON tags.ID = tagMessagesRelations.tagID INNER JOIN messages ON tagMessagesRelations.messageID = messages.ID GROUP BY messages.UserID