2012-04-23 14 views
5

Quiero almacenar una lista de tamaño variable de etiquetas de imágenes en una base de datos SQL y luego poder buscar en la base de datos las imágenes basadas en las etiquetas. Actualmente estoy sacando las listas de etiquetas de la base de datos y comprobando si la etiqueta de consulta está contenida en la matriz. ¿Hay alguna manera de formatear estas consultas como sql en lugar de hacerlo en php después de sacar las etiquetas?Almacenamiento de una matriz de cadenas SQL y consulta posterior

La lista se almacena como valores separados por comas de la forma:

"sol, playa, palmeras" -im1

"palmas, lluvia, nubes" -im2

"de invierno, la nieve , muñeco de nieve, swag" -img

me gustaría ser capaz de conseguir la unión de las etiquetas de consulta: Una consulta de 'playa, palmeras' debe regresar im1 y im2

Gracias

Respuesta

10

Querrá evitar listas delimitadas en su base de datos, como ha comprobado, que anula las ventajas de utilizar una base de datos para almacenar datos estructurados. En su lugar, debe crear una nueva tabla con una etiqueta por fila, y luego hacer referencia a esa tabla, utilizando una clave externa , desde su tabla de imágenes principales.

Imágenes Tabla

  • Identificación
  • image_name

Etiquetas Tabla

  • Identificación
  • t ag_name

Image_Tags Tabla

  • image_id (referencias Imágenes clave principal tabla)
  • tag_id (referencias Etiquetas clave principal tabla)

De esta manera, usted será capaz de para ejecutar consultas como esta:

SELECT t.tag_name, i.image_name FROM image_tags it 
    INNER JOIN images i on it.image_id = i.id 
    INNER JOIN tags t on it.tag_id = t.id 
WHERE t.tag_name in ('beach', 'palms') 
+1

Gran respuesta. Esta es la segunda vez que visito a gente usando listas de valores dentro de un DB y queriendo buscarlas ... ¿Cuál es el punto de la relación de DB sin relaciones? P – DanRedux

+0

Gracias. De hecho, encontré este artículo bastante bueno que describe otras dos formas de hacerlo. http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html#toxi – kmdent

2

@dbaseman proporcionó un good answer (+1), pero podría ser un poco exagerado.Suponiendo que la única cosa que usted quiere saber acerca de una etiqueta es su nombre, el modelo con sólo 2 mesas probablemente se comportan mejor en la práctica (uno menos JOIN y mejor clustering de datos):

tabla de imagen:

  • Identificación del PK
  • nombre_imagen mesa

image_tag:

  • tag_name PK
  • PK image_id, FK -> imagen

El orden de los campos en PK de image_tag es importante: si lo mantiene como {tag_name, image_id} va muy bien agrupar los datos (es decir, mantener las imágenes con las mismas etiquetas al mismo tiempo), tal y como lo necesite para realizar consultas:

SELECT DISTINCT image.* 
FROM image JOIN image_tag ON (image.id = image_tag.image_id) 
WHERE image_tag.tag_name IN ('beach', 'palms') 

Por otro lado, si también necesita una etiqueta de la descripción, autor etiqueta etc ..., @ modelo de dbaseman está bien, excepto podría considerar cambiar el orden de los campos en Image_Tags PK (por los mismos motivos de agrupamiento que antes).

Cuestiones relacionadas