Question

J'essaie de trouver un moyen d'interroger une table de consultation des entités de propriétés.

J'ai une table de propriété contenant des informations sur les propriétés en location (adresse, loyer, caution, nombre de chambres, etc.) ainsi qu'une autre table (Property_Feature) qui représente les caractéristiques de cette propriété (piscine, climatisation, blanchisserie, etc.). site, etc.). Les fonctionnalités elles-mêmes sont définies dans un autre tableau intitulé Feature.

Property
    pid - primary key
    other property details

Feature
    fid - primary key
    name
    value

Property_Feature
    id - primary key
    pid - foreign key (Property)
    fid - foreign key (Feature)

Supposons que quelqu'un souhaite rechercher un bien doté de la climatisation, d'une piscine et d'une laverie sur place. Comment interrogez-vous la table Property_Feature pour plusieurs entités pour la même propriété si chaque ligne ne représente qu'une seule entité? À quoi ressemblerait la requête SQL? Est-ce possible? Y a-t-il une meilleure solution?

Merci pour votre aide et votre perspicacité.

Était-ce utile?

La solution

En termes de conception de base de données, la vôtre est la bonne façon de le faire. C'est correctement normalisé.

Pour la requête, j'utiliserais simplement existe, comme ceci:

select * from Property
where 
exists (select * from Property_Feature where pid = property.pid and fid = 'key_air_conditioning')
and
exists (select * from Property_Feature where pid = property.pid and fid = 'key_pool')

Où key_air_conditioning et key_pool sont évidemment les clés de ces fonctionnalités.

Les performances seront satisfaisantes même pour les bases de données volumineuses.

Autres conseils

Voici la requête qui trouvera toutes les propriétés avec un pool:

select
    p.*
from
    property p
    inner join property_feature pf on
        p.pid = pf.pid
    inner join feature f on
        pf.fid = f.fid
where
    f.name = 'Pool'

J'utilise des jointures internes au lieu de EXISTS car cela tend à être un peu plus rapide.

Vous pouvez également faire quelque chose comme ceci:

  SELECT * 
    FROM Property p
   WHERE 3 =
         ( SELECT COUNT(*)
             FROM Property_Feature pf
                , Feature f
            WHERE pf.pid = p.pid
              AND pf.fid = f.fid
              AND f.name in ('air conditioning', 'pool', 'laundry on-site')
         );

Évidemment, si votre front-end capture les images des éléments de fonctionnalité lorsque l'utilisateur les sélectionne, vous pouvez vous passer de la jointure à Feature et contraindre directement la fonction fid. Votre frontal connaît le nombre de fonctionnalités sélectionnées, ce qui permet de déterminer la valeur de " 3 " ci-dessus est trivial.

Comparez-le, en termes de performances, à la construction de tekBlues ci-dessus; En fonction de la distribution de vos données, l'une ou l'autre de ces requêtes peut être la requête la plus rapide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top