EDIT: Para personas que crean sistemas de etiquetado. No leas esto No es lo que estás buscando. Le pregunté esto cuando no sabía que todos los RDBMS tienen sus propios métodos de optimización, solo usa un esquema simple de muchos a muchos.Esquema de etiquetado de base de datos escalable
Tengo un sistema de publicación que tiene millones de mensajes. Cada publicación puede tener un número infinito de etiquetas asociadas.
Los usuarios pueden crear etiquetas que tienen notas, fecha de creación, propietario, etc. Una etiqueta es casi como una publicación en sí, porque las personas pueden publicar notas sobre la etiqueta.
Cada asociación de etiquetas tiene un propietario y una fecha, por lo que podemos ver quién agregó la etiqueta y cuándo.
Mi pregunta es ¿cómo puedo implementar esto? Tiene que ser una búsqueda rápida de publicaciones por etiqueta o etiquetas por publicación. Además, los usuarios pueden agregar etiquetas a las publicaciones al escribir el nombre en un campo, algo así como la barra de búsqueda de Google, tiene que completar el resto del nombre de la etiqueta por usted.
Tengo 3 soluciones en este momento, pero no estoy seguro de cuál es la mejor, o si hay una mejor manera.
Tenga en cuenta que no estoy mostrando el diseño de las notas, ya que será trivial una vez que obtenga una solución adecuada para las etiquetas.
Método 1. lista Vinculado
TagId en puntos enviar a una lista enlazada en tag_assoc, la aplicación deben atravesar la lista hasta flink = 0
post: id, content, ownerId, date, tagId, notesId
tag_assoc: id, tagId, ownerId, flink
tag: id, name, notesId
Método 2. Desnormalización
etiquetas es simplemente un campo VARCHAR o TEXT que contiene una matriz delimitada por tabulaciones de tagId: ownerId. No puede ser un tamaño fijo.
post: id, content, ownerId, date, tags, notesId
tag: id, name, notesId
Método 3. detector Toxi
(de: http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html, también mismo aquí: Recommended SQL database design for tags or tagging)
post: id, content, ownerId, date, notesId
tag_assoc: ownerId, tagId, postId
tag: id, name, notesId
Método 3 plantea la pregunta, qué tan rápido va a ser para iterar a través de cada una sola fila en tag_assoc?
Los métodos 1 y 2 deben ser rápidos para devolver las etiquetas por correo postal, pero para las publicaciones por etiqueta, se debe realizar otra tabla de búsqueda.
Lo último que tengo que preocuparme es optimizar las etiquetas de búsqueda por nombre, todavía no lo he resuelto.
hice un diagrama de ASCII aquí: http://pastebin.com/f1c4e0e53
Las etiquetas se comparten en las publicaciones. Ahora estoy más o menos decidido por el método 3. Cada tabla que puede tener etiquetas tendrá otra tabla llamada _tags. EG: news_tags. Todavía estoy algo incompleto con este método, pero todos parecen recomendarlo, así que supongo que MySQL lo optimizará. –
"asumiendo" - mala idea. Saber es mejor – duffymo