Práctica recomendada para consultar una tabla de búsqueda
-
06-07-2019 - |
Pregunta
Estoy tratando de encontrar una manera de consultar una tabla de búsqueda de características de propiedad.
Tengo una tabla de propiedades que contiene información de la propiedad de alquiler (dirección, alquiler, depósito, número de habitaciones, etc.) junto con otra tabla (Property_Feature) que representa las características de esta propiedad (piscina, aire acondicionado, lavandería en- sitio, etc.). Las características mismas se definen en otra tabla denominada Característica.
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)
Digamos que alguien quiere buscar una propiedad que tenga aire acondicionado y una piscina y lavandería en el lugar. ¿Cómo se consulta la tabla Property_Feature para obtener varias características para la misma propiedad si cada fila solo representa una característica? ¿Cómo sería la consulta SQL? es posible? ¿Hay una mejor solución?
Gracias por la ayuda y la información.
Solución
En términos de diseño de base de datos, el suyo es la forma correcta de hacerlo. Está correctamente normalizado.
Para la consulta, simplemente usaría existe, así:
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')
Donde key_air_conditioning y key_pool son obviamente las claves para esas características.
El rendimiento estará bien incluso para grandes bases de datos.
Otros consejos
Aquí está la consulta que encontrará todas las propiedades con un grupo:
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 combinaciones internas en lugar de EXISTS
ya que tiende a ser un poco más rápido.
También puedes hacer algo como esto:
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')
);
Obviamente, si su front-end captura los fids de los elementos de la función cuando el usuario los selecciona, puede prescindir de la unión a Feature y restringir directamente el fid. Su front end sabría cuál fue el recuento de características seleccionadas, por lo que determinar el valor de '' 3 '' arriba es trivial.
Compárelo, en cuanto al rendimiento, con la construcción tekBlues anterior; dependiendo de su distribución de datos, cualquiera de estos podría ser la consulta más rápida.