2009-06-18 6 views
2

J'essaie de trouver un moyen d'interroger une table de recherche de caractéristiques de propriété. J'ai une table de propriétés qui contient des informations sur les propriétés à louer (adresse, loyer, dépôt, nombre de chambres à coucher, etc.) ainsi qu'une autre table (propriété) qui représente les caractéristiques de cette propriété (piscine, climatisation, blanchisserie sur -site, etc.). Les fonctionnalités elles-mêmes sont définies dans un autre tableau intitulé Feature. Disons que quelqu'un veut chercher une propriété qui a l'air conditionné, et une piscine et 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 entité? À quoi ressemblerait la requête SQL? Est-ce possible? Y a-t-il une meilleure solution?Meilleure pratique pour interroger une table de recherche

Merci pour l'aide et la perspicacité.

+1

Vous pouvez réellement supprimer la colonne "id" sur la table Property_Feature et faire pid et fid une clé primaire combinée. –

Répondre

1

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

Pour la requête, je voudrais simplement utiliser 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 caractéristiques.

Les performances seront correctes même pour les grandes bases de données.

+0

C'est assez hostile, n'est-ce pas? Tu t'attends à ce qu'il mémorise les clés? Pourquoi ne pas utiliser les jointures de sorte que vous pouvez simplement nommer la fonctionnalité au lieu d'essayer de se souvenir de ce qui pourrait être une colonne d'identité? – Eric

+0

Eric, parce qu'il le fait dans le contexte d'un programme évidemment, et la clé est probablement proche. Je préfère les EXISTS parce qu'ils sont plus propres et plus faciles à construire, surtout si le nombre de conditions est variable. – tekBlues

+0

Les joints ont tendance à être un peu brouillon avec un nombre variable de conditions ... Je vais devoir réfléchir à la façon de faire ce nettoyeur ... et comme un défi, je veux le faire un peu différemment que vous avez :) – Eric

1

est ici la requête qui trouveront toutes les propriétés avec piscine:

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 au lieu de jointures EXISTS car il a tendance à être un peu plus rapide.

+0

Merci Eric J'ai complètement négligé le mot-clé EXISTS. –

0

Vous pouvez aussi 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') 
     ); 

De toute évidence, si votre extrémité avant capture FIDS des éléments de fonction lorsque l'utilisateur de les sélectionner, vous pouvez passer la jointure à FEATURE et contraindre directement sur fid. Votre frontal connaissant le nombre de fonctionnalités sélectionnées, la détermination de la valeur de "3" ci-dessus est triviale.

Comparez cela, en termes de performances, avec la construction tekBlues ci-dessus; en fonction de votre distribution de données, l'une ou l'autre peut être la requête la plus rapide.

+0

J'apprécie les commentaires. Toutes ces solutions je vais essayer. –