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

Recuperando dados com uma estrutura hierárquica no MySQL


O MySQL não possui consultas recursivas, que fazem parte do SQL padrão. Muitas outras marcas de banco de dados suportam esse recurso, incluindo PostgreSQL (consulte http://www.postgresql.org/docs/8.4/static/queries-with.html ).

Existem várias técnicas para lidar com dados hierárquicos no MySQL.
  • O mais simples seria adicionar uma coluna para observar a hierarquia à qual uma determinada foto pertence. Em seguida, você pode procurar as fotos que pertencem à mesma hierarquia, buscá-las todas de volta ao seu aplicativo e descobrir as que você precisa lá. Isso é um pouco desperdício em termos de largura de banda, exige que você escreva mais código de aplicativo e não é bom se suas árvores tiverem muitos nós.

Existem também algumas técnicas inteligentes para armazenar dados hierárquicos para que você possa consultá-los:

  • Enumeração de caminho armazena a lista de ancestrais com cada nó. Por exemplo, a foto 5 em seu exemplo armazenaria "0-2-4-5". Você pode pesquisar ancestrais pesquisando nós cujo caminho concatenado com "%" corresponde ao caminho de 5 com um LIKE predicado.

  • Conjuntos aninhados é uma técnica complexa, mas inteligente, popularizada por Joe Celko em seus artigos e em seu livro "Trees and Hierarchical in SQL for Smarties". Existem inúmeros blogs e artigos online sobre isso também. É fácil consultar árvores, mas difícil consultar filhos ou pais imediatos e difícil inserir ou excluir nós.

  • Tabela de encerramento envolve armazenar cada relacionamento ancestral/descendente em uma tabela separada. É fácil consultar árvores, inserir e excluir e consultar pais ou filhos imediatos se você adicionar um comprimento de caminho coluna.

Você pode ver mais informações comparando esses métodos em minha apresentação Practical Object -Modelos Orientados em SQL ou meu próximo livro SQL Antipatterns:Avoiding the Pitfalls of Database Programming .