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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top