Oracle
 sql >> Database >  >> RDS >> Oracle

Interrogazione su EAV SQL Design

Devi aggiungere un predicato per ogni combinazione nome/valore:

  SELECT <whatever you need>
    FROM Entity_Table et
   WHERE et.e_name = 'Joe'
     AND EXISTS (SELECT 1 
                   FROM AttributeValue_Table avt
                   JOIN Entity_AttrVal ea ON ea.e_id = et.e_id
                  WHERE ea.a_id = avt.av_id
                    AND avt.prop_name = 'color'
                    AND avt.prop_value = 'black')
     AND EXISTS (SELECT 1 
                   FROM AttributeValue_Table avt
                   JOIN Entity_AttrVal ea ON ea.e_id = et.e_id
                  WHERE ea.a_id = avt.av_id
                    AND avt.prop_name = 'whiskers'
                    AND avt.prop_value = 'short')

(Mi scuso se il mio dialetto di Sql Server traspare)

Per eseguire un numero arbitrario di confronti, dovresti generare l'SQL ed eseguirlo.

Come detto in un commento, questo dimostra che EAV è una seccatura (un anti-modello, in realtà), ma so per esperienza che a volte semplicemente non c'è alternativa se siamo legati a un database relazionale.