2012-04-23 10 views
5

Desidero memorizzare un elenco di variabili di tag immagine in un database SQL e quindi essere in grado di cercare nel database le immagini basate sui tag. Sto attualmente estraendo gli elenchi di tag dal database e controllando se il tag di query è contenuto nell'array. C'è un modo in cui posso formattare queste query come sql invece di farle in php dopo che ho estratto i tag?Memorizzazione di un array di stringhe SQL e interrogazioni successive

La lista viene memorizzato come valori separati da virgola della forma:

"sole, spiaggia, palme" -im1

"palme, pioggia, nuvole" -im2

"inverno, neve , pupazzo di neve, swag" -img

mi piacerebbe essere in grado di ottenere l'unione dei tag di query: Una query di 'spiaggia, palme' deve tornare im1 e IM2

Grazie

risposta

10

Avrai bisogno di evitare gli elenchi delimitati nel tuo database-- come hai scoperto, che nega i vantaggi dell'utilizzo di un database per memorizzare i dati strutturati. Invece dovresti creare una nuova tabella con un tag per riga e quindi fare riferimento a quella tabella, usando una chiave esterna , dalla tua tabella immagini principale.

Immagini Tabella

  • id
  • nome_immagine

Tag Tabella

  • id
  • t ag_name

Image_Tags Tabella

  • image_id (chiave primaria tabella riferimenti Immagini)
  • tag_id (riferimenti Tag tabella della chiave primaria)

In questo modo, sarete in grado per eseguire query come questa:

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

Ottima risposta. Questa è la seconda volta che visitiamo persone che usano liste di valori all'interno di un DB e che vogliono cercarle ... Qual è il punto del DB relazionale senza relazioni: P – DanRedux

+0

Grazie. In realtà ho trovato questo articolo abbastanza buono che descrive altri due modi per farlo. http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html#toxi – kmdent

2

@dbaseman fornito un good answer (+1), ma è potrebbe essere un po 'eccessivo.Supponendo che l'unica cosa che si desidera sapere su un tag è il suo nome, il modello con solo 2 tavoli probabilmente comportarsi meglio in pratica (uno in meno JOIN e una migliore clustering dei dati):

tabella immagine:

  • id PK
  • nome_immagine tavolo

image_tag:

  • tag_name PK
  • image_id PK, FK -> immagine

L'ordine dei campi in PK di image_tag è importante: se si tiene come {tag_name, image_id} sarà bene raggruppare i dati (vale a dire tenere le immagini con stessi tag insieme), esattamente come avete bisogno per l'interrogazione:

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

D'altra parte, se anche avete bisogno di un tag di descrizione, tag autore ecc ..., @ il modello di dbaseman è bene, tranne potresti prendere in considerazione l'inversione dell'ordine dei campi in Image_Tags PK (per gli stessi motivi di clustering come sopra).

Problemi correlati