sql >> Base de Datos >  >> RDS >> Oracle

Consultas en EAV SQL Design

Debe agregar un predicado para cada combinación de nombre/valor:

  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')

(Me disculpo si mi dialecto de Sql Server brilla)

Para hacer una cantidad arbitraria de comparaciones, debe generar el SQL y ejecutarlo.

Como se dijo en un comentario, esto demuestra que EAV es un dolor (un anti-patrón, en realidad), pero sé por experiencia que a veces simplemente no hay alternativa si estamos vinculados a una base de datos relacional.