Méthode recommandée pour interroger une table de consultation
-
06-07-2019 - |
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é.
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.