Pergunta

Estou programando um site que permite aos usuários publicar anúncios classificados com campos detalhados para diferentes tipos de itens que estão vendendo. No entanto, tenho uma pergunta sobre o melhor esquema de banco de dados.

O site apresenta muitas categorias (por exemplo, carros, computadores, câmeras) e cada categoria de anúncios tem seus próprios campos distintos. Por exemplo, os carros têm atributos como número de portas, fabricação, modelo e potência, enquanto os computadores têm atributos como CPU, RAM, modelo de placa -mãe, etc.

Agora, como são todas listagens, eu estava pensando em uma abordagem polimórfica, criando uma tabela de listagens de pais e uma tabela infantil diferente para cada uma das diferentes categorias (computadores, carros, câmeras). Cada tabela infantil terá um listing_id que será vinculado à tabela de listagens. Portanto, quando uma listagem é buscada, ela buscava uma linha de listagens unidas pela linha vinculada na tabela infantil associada.

LISTINGS
-listing_id
-user_id
-email_address
-date_created
-description

CARS
-car_id
-listing_id
-make
-model
-num_doors
-horsepower

COMPUTERS
-computer_id
-listing_id
-cpu
-ram
-motherboard_model

Agora, esse esquema é um bom padrão de design ou existem maneiras melhores de fazer isso?

Eu considerei a herança única, mas rapidamente afastou o pensamento porque a tabela ficará muito grande rapidamente, mas outro dilema veio à mente - se o usuário fizer uma pesquisa global em todas as listagens, isso significa que terei que consultar cada criança tabela separadamente. O que acontece se eu tiver mais de 100 categorias diferentes, não seria ineficiente?

Também pensei em outra abordagem em que há uma tabela mestre (meta tabela) que define os campos em cada categoria e uma tabela de campo que armazena os valores de campo de cada listagem, mas isso iria contra a normalização do banco de dados?

Como sites como Kijiji faria isso?

Foi útil?

Solução

O design do seu banco de dados está bem. Não há razão para mudar o que você tem. Eu vi a pesquisa feita de algumas maneiras. Uma é fazer com que seu procedimento armazenado de pesquisa participe de todas as tabelas que você precisa pesquisar e indexar as colunas a serem pesquisadas. A segunda maneira que eu o vi, o que funcionou muito bem foi ter uma tabela que é usada apenas para pesquisa que obtém uma cópia de quaisquer campos que precisem ser pesquisados. Então você colocaria gatilhos nesses campos e atualizava a tabela de pesquisa.

Ambos têm desvantagens, mas eu preferia o primeiro ao segundo.

EDITAR

Você precisa das seguintes tabelas.

Categorias - ID - Descrição

Categorieslistingsxref - categoryId - listingId

Com este modelo de referência cruzada, você pode participar de todas as suas listagens para uma determinada categoria durante a pesquisa. Em seguida, adicione um pouco de SQL dinâmico (porque é mais fácil de entender) e crie sua consulta para incluir o (s) campo (s) que você deseja pesquisar e ligar para executar em sua consulta.

É isso.

Editar 2 Isso parece ser um pouco maior de discussão que podemos finalizar nessas caixas de comentários. Mas qualquer coisa que discutiríamos pode ser entendida lendo a seguinte postagem. http://www.sommarskog.se/dyn-search-2008.html

É realmente completo e mostra mais de uma maneira de fazê -lo com profissionais e contras. Boa sorte.

Outras dicas

Eu acho que o design que você escolheu será bom para o cenário que você acabou de descrever. Embora eu não tenha certeza se as tabelas de sub -classe devem ter sua própria identificação. Como um carro é uma listagem, faz sentido que os valores sejam do mesmo "domínio".

No site típico de anúncios classificados, os dados para um anúncio são gravados uma vez e depois são basicamente somente leitura. Você pode explorar isso e armazenar os dados em um segundo conjunto de tabelas que são mais otimizadas para pesquisar da maneira que você deseja que os usuários pesquisem. Além disso, o problema de pesquisa realmente existe apenas para uma pesquisa "geral". Depois que o usuário escolher um certo tipo de anúncio, você pode alternar para as tabelas de sub -classe para fazer pesquisa mais avançada (RAM> 4GB, CPU = sobrecarregado).

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