Pergunta

Eu sinto que este é provavelmente um problema comum, mas do meu google busca não consigo encontrar uma solução tão específico para o meu problema.

Eu tenho uma lista de Organizações (tabela) em meu banco de dados e eu preciso ser capaz de executar consultas com base em sua hierarquia. Por exemplo, se você consulta a maior Organização, eu gostaria de devolver o Id do de todas as organizações listadas abaixo desse Organização. Além disso, se eu consultar um tipo organização do mid-range, eu quero apenas o da Organização Id listados sob referida Organização.

O que é a melhor maneira de a) definir o esquema de banco de dados e b consulta)? Quero só para ter que enviar o mais alto Organização Id e, em seguida, ficar sob o Id referida Organização.

Eu acho que faz sentido, mas eu possa esclarecer, se necessário.

Foi útil?

Solução

Uma maneira simples é armazenar parentesco da organização em um campo de texto, como:

VENDAS-EUROPA-NORTE

Para procurar cada organização de vendas, você pode consultar on vendas-%. Para cada vendas na Europa org, consulta sobre as vendas-EUROPE -.%

Se você renomear uma organização, ter o cuidado de atualizar suas organizações criança também.

Este mantém simples, sem recursão, à custa de alguma flexibilidade.

Outras dicas

Como prometido no meu comentário, eu desenterrar um artigo sobre como armazenar hierarquias em um banco de dados que permite a recuperação de tempo constante de sub-árvores arbitrárias. Eu acho que vai atender às suas necessidades muito melhor do que a resposta atualmente marcado como aceito, tanto na facilidade de uso e velocidade de acesso. Eu poderia jurar que vi esse mesmo conceito na wikipedia originalmente, mas não posso encontrá-lo agora. É aparentemente chamado de "pré-venda modificado árvore travessia". A essência do que é que você numerar cada nó na árvore duas vezes, ao fazer um percurso em profundidade, uma vez que no caminho para baixo, e uma vez no caminho de volta para cima (ou seja, quando você está a desenrolar a pilha, em uma implementação recursiva) . Isto significa que os filhos de um dado nó têm todos os seus números entre os dois números desse nó. Jogue um índice sobre as colunas e você tem pesquisas muito rápido. Eu tenho certeza que é uma terrível explicação, por isso leia o artigo, que entra em mais profundidade e inclui fotos.

A maneira mais fácil é ter uma coluna ParentID, que é uma chave externa para a coluna ID na mesma tabela, NULL para nós raiz. Mas este método tem alguns inconvenientes.

conjuntos aninhados são uma maneira eficiente de árvores armazenam em um banco de dados relacional.

Você poderia ter uma organização têm um PK id e um pai FK referência ao id. Em seguida, para a consulta, o uso (se o seu back-end de banco de dados suportá-las) consultas recursivas, aka Common Table Expressions.

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