Best Practice, um eine Lookup-Tabelle abfragt
-
06-07-2019 - |
Frage
Ich versuche, einen Weg, um herauszufinden, eine Eigenschaft Feature-Lookup-Tabelle abzufragen.
Ich habe eine Eigenschaft Tabelle, die das Objekt (Adresse, Miete, Kaution, Anzahl der freien Zimmer, etc.) enthält zusammen mit einer anderen Tabelle (Property_Feature), die die Merkmale dieser Immobilie (Pool, Klimaanlage, Wäscherei steht für On- Website, etc.). Die Funktionen selbst noch in einer anderen Tabelle markiert Eigenschaft definiert sind.
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)
Lassen Sie sagen, jemand will nach Immobilien suchen, die eine Klimaanlage und ein Pool und Wäsche vor Ort. Wie abfragen Sie die Property_Feature Tabelle für mehrere Merkmale für die gleiche Eigenschaft, wenn jede Zeile nur ein Merkmal darstellt? Wie würde die SQL-Abfrage wie? Ist das möglich? Gibt es eine bessere Lösung?
Danke für die Hilfe und Einsicht.
Lösung
In Bezug auf dem Datenbank-Design, sind Sie der richtige Weg, es zu tun. Es ist richtig normalisiert.
Für die Abfrage, würde ich einfach existiert verwenden, wie folgt aus:
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')
Wo key_air_conditioning und key_pool sind offensichtlich die Schlüssel für diese Funktionen.
Die Leistung wird in Ordnung sein, auch für große Datenbanken.
Andere Tipps
Hier ist die Abfrage, die alle Eigenschaften mit einem Pool finden:
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'
Ich benutze innere Joins statt EXISTS
da es ein bisschen schneller zu sein tendiert.
Sie können auch etwas tun:
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')
);
Natürlich, wenn Ihr vorderes Ende der fids der Merkmal Elemente erfassen, wenn der Benutzer sich auswählt, können Sie mit der Join verzichten direkt auf fid zu zeichnen und zu beschränken. Ihr vorderes Ende würde wissen, was die Anzahl der Funktionen ausgewählt wurde, so dass der Wert der Bestimmung für „3“ oben ist trivial.
Vergleichen Sie es, Leistung klug, auf die tekBlues Konstruktion oben; Je nach Datenverteilung, entweder eine von ihnen könnte die schnellere Abfrage sein.