Oracle
 sql >> Base de données >  >> RDS >> Oracle

Interrogation sur EAV SQL Design

Vous devez ajouter un prédicat pour chaque combinaison nom/valeur :

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

(Je m'excuse si mon dialecte Sql Server transparaît)

Pour faire un nombre arbitraire de comparaisons, vous devez générer le SQL et l'exécuter.

Comme dit dans un commentaire, cela montre que l'EAV est une douleur (un anti-modèle, vraiment), mais je sais par expérience que parfois il n'y a tout simplement pas d'alternative si nous sommes liés à une base de données relationnelle.