Best practice per l'interrogazione di una tabella di ricerca
-
06-07-2019 - |
Domanda
Sto cercando di trovare un modo per interrogare una tabella di ricerca delle caratteristiche della proprietà.
Ho una tabella delle proprietà che contiene informazioni sulla proprietà in affitto (indirizzo, affitto, deposito, numero di camere da letto, ecc.) insieme a un'altra tabella (Proprietà_funzione) che rappresenta le caratteristiche di questa proprietà (piscina, aria condizionata, servizio lavanderia- sito, ecc.). Le funzionalità stesse sono definite in un'altra tabella denominata 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)
Supponiamo che qualcuno voglia cercare immobili con aria condizionata, piscina e lavanderia in loco. Come si esegue una query nella tabella Property_Feature per più funzionalità per la stessa proprietà se ogni riga rappresenta solo una funzione? Come sarebbe la query SQL? È possibile? C'è una soluzione migliore?
Grazie per l'aiuto e la comprensione.
Soluzione
In termini di progettazione del database, il tuo è il modo giusto per farlo. È correttamente normalizzato.
Per la query, vorrei semplicemente usare esiste, in questo modo:
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')
Dove key_air_conditioning e key_pool sono ovviamente le chiavi di queste funzionalità.
Le prestazioni saranno OK anche per database di grandi dimensioni.
Altri suggerimenti
Ecco la query che troverà tutte le proprietà con 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'
Uso i join interni anziché EXISTS
poiché tende ad essere un po 'più veloce.
Puoi anche fare qualcosa del genere:
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')
);
Ovviamente, se il tuo front-end sta acquisendo i fidi degli elementi della funzione quando l'utente li sta selezionando, puoi rinunciare al join alla funzione e vincolare direttamente su fid. Il tuo front-end saprebbe qual era il conteggio delle funzionalità selezionate, determinando così il valore per "3" sopra è banale.
Confrontalo, per quanto riguarda le prestazioni, con la costruzione di tekBlues sopra; a seconda della distribuzione dei dati, una di queste potrebbe essere la query più veloce.