Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Alcançar hierarquia, relacionamento pai/filho de uma maneira eficaz e fácil


Infelizmente, se você não puder alterar o modelo de dados e estiver usando o MySQL, ficará preso em uma situação em que precisa de consultas recursivas e está usando um DBMS que não suporta consultas recursivas.

Quassnoi escreveu uma série interessante de artigos de blog, mostrando técnicas para consultar dados hierárquicos. Suas soluções são bastante inteligentes, mas muito complexas.http:// explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

O PostgreSQL é outro RDBMS de código aberto, que suporta consultas recursivas , para que você possa buscar uma árvore inteira armazenada da maneira que mostra. Mas se você não puder alterar o modelo de dados, suponho que você não possa alternar para um RDBMS diferente.

Existem vários modelos de dados alternativos que facilitam muito a busca de árvores com profundidade arbitrária:
  • Tabela de fechamento
  • Conjuntos aninhados, também conhecidos como passagem de árvore de pré-encomenda modificada
  • Enumeração de caminho, também conhecido como caminho materializado

Eu abordo isso em minha apresentação Modelos para dados hierárquicos com SQL e PHP , e em meu livro SQL Antipatterns:Avoiding the Pitfalls of Database Programming .

Por fim, há outra solução que vi usada no código para Slashdot , para suas hierarquias de comentários:Eles armazenam "parent_id" como na Lista de Adjacências, mas também armazenam uma coluna "root_id". Cada membro de uma determinada árvore tem o mesmo valor para root_id, que é o nó ancestral mais alto em sua árvore. Então é fácil buscar uma árvore inteira em uma consulta:
SELECT * FROM site WHERE root_id = 123;

Em seguida, seu aplicativo busca todos os nós de volta do banco de dados em um array, e você precisa escrever o código para fazer um loop sobre esse array, inserindo os nós em uma estrutura de dados em árvore na memória. Esta é uma boa solução se você tiver muitas árvores separadas e cada árvore tiver relativamente poucas entradas. É bom para o caso de Slashdot.