¿Cómo diseñar una base de datos para apoyar las siguientes características de etiquetas:Diseño de base de datos para el etiquetado
- artículos pueden tener un gran número de etiquetas
- búsquedas para todos los elementos que están etiquetadas con un determinado conjunto de etiquetas debe ser rápido (los artículos deben tener todas las etiquetas, por lo que es un Y-búsqueda, no un O-búsqueda)
- crear/escribir artículos puede ser más lenta para permitir la búsqueda rápida/lectura
Idealmente, las operaciones de búsqueda de todos los artículos que están etiquetados con (al menos) un conjunto de n etiquetas dadas deben hacerse usando una sola instrucción SQL. Como el número de etiquetas para buscar así como el número de etiquetas en cualquier elemento son desconocidas y pueden ser altas, el uso de JOINs no es práctico.
¿Alguna idea?
Gracias por todas las respuestas hasta el momento.
Sin embargo, si no me equivoco, las respuestas proporcionadas muestran cómo hacer una búsqueda OR en las etiquetas. (Seleccione todos los artículos que tienen una o más n etiquetas). Estoy buscando una búsqueda AND eficiente. (Seleccionar todos los elementos que tienen todas las etiquetas n - y posiblemente más.)
Debo decir que la respuesta es un poco miope, porque usar un tipo de campo de bit de la base de datos te limita a un número específico de bits. Esto no significa que cada elemento está limitado a un cierto número de etiquetas, sino que solo puede haber un cierto número de etiquetas únicas en todo el sistema (por lo general, hasta 32 o 64). –
Suponiendo una implementación 3nf (Question, Tag, Question_has_Tag), y un índice de mapa de bits en Tag_id en Question_has_Tag, el índice de mapa de bits tiene que reconstruirse cada vez que una pregunta tiene una etiqueta agregada o eliminada. Una consulta como 'seleccionar * de la pregunta q combinación interna question_has_tag qt donde tag_id in (seleccionar tag_id de etiquetas donde (lo que queremos) menos seleccionar tag_id de etiquetas donde (lo que no)' debería estar bien y escalar asumiendo el derecho Los índices b-tree existen en la tabla central –
El enlace "Este artículo" está muerto. Me hubiera gustado leer eso :( – mpen