Pergunta

Eu estou tentando descobrir uma maneira de consultar uma tabela de pesquisa recurso propriedade.

Eu tenho uma tabela de propriedade que contém informação de aluguel da propriedade (endereço, aluguel, depósito, número de quartos, etc.) juntamente com outra tabela (Property_Feature) que representa as características desta propriedade (piscina, ar condicionado, lavanderia on- local, etc.). Os recursos próprios são definidos em outra mesa Característica rotulados.

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)

Vamos dizer que alguém quer procurar propriedade que tem ar condicionado, e uma piscina e lavanderia no local. Como você consultar a tabela de Property_Feature para vários recursos para a mesma propriedade, se cada linha representa apenas uma característica? Qual seria a aparência de consulta SQL como? Isso é possível? Existe uma solução melhor?

Obrigado pela ajuda e compreensão.

Foi útil?

Solução

Em termos de design de banco de dados, o seu é o caminho certo para fazê-lo. É corretamente normalizada.

Para a consulta, eu simplesmente uso existe, como este:

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')

Onde key_air_conditioning e key_pool são, obviamente, as chaves para esses recursos.

O desempenho será OK, mesmo para grandes bancos de dados.

Outras dicas

Aqui está a consulta que vai encontrar todas as propriedades com piscina:

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'

Eu uso associações internas em vez de EXISTS uma vez que tende a ser um pouco mais rápido.

Você também pode fazer algo como isto:

  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, se a sua extremidade dianteira é capturar os fids dos itens de recurso quando o usuário está selecionando-os, você pode dispensar a juntar-se ao Recurso e restringir diretamente no FID. Seu fim dianteiro saberia o que a contagem de recursos selecionado foi, por isso, determinar o valor de "3" acima é trivial.

Compare-o, desempenho sábio, para a construção tekBlues acima; dependendo da sua distribuição de dados, qualquer um destes pode ser a consulta mais rápida.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top