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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top