Gerenciando hierarquias no SQL: conjuntos MPTT / aninhados vs listas de adjacências vs caminhos de armazenamento

Há um tempo que estou lutando com a melhor forma de lidar com hierarquias no SQL. Frustrado pelas limitações das listas de adjacência e pela complexidade dos conjuntos MPTT / aninhados, comecei a pensar em simplesmente armazenar caminhos-chave, como um simplesnode_key/node_key/... corda. Decidi compilar os prós e contras das três técnicas:

Número de chamadas necessárias para criar / excluir / mover um nó:Adjacency = 1MPTT = 3Path = 1 (Substitua o caminho do nó antigo pelo novo caminho do nó em todos os nós que contêm esse caminhNúmero de chamadas necessárias para obter uma árvore:Adjacency = [número de subníveis]MPTT = 1Path = 1Número de chamadas necessárias para obter o caminho para um nó / ancestralidade:Adjacency = [número de superníveis]MPTT = 1Path = 0Número de chamadas necessárias para obter o número de subnós:Adjacency = [número de subníveis]MPTT = 0 (pode ser calculado a partir dos valores da direita / esquerda)Path = 1Número de chamadas necessárias para obter a profundidade do nó:Adjacency = [número de superníveis]MPTT = 1Path = 0ampos @DB obrigatórios:Adjacency = 1 (pai)MPTT = 3 (pai, direita, esquerda)Path = 1 (caminho)Conclusã

A técnica do caminho armazenado usa as mesmas chamadas ou menos que as outras técnicas em todos os casos de uso, exceto um. Por essa análise, o armazenamento de caminhos é um vencedor claro. Sem mencionar, é muito mais simples de implementar, legível por humanos, etc.

Então a pergunta é: os caminhos armazenados não devem ser considerados uma técnica mais forte que o MPTT? Por que os caminhos armazenados não são uma técnica mais comumente usada e por que você não os usaria no MPTT em uma determinada instância?

Além disso, se você acha que essa análise está incompleta, entre em contat

ATUALIZAR

Aqui estão pelo menos duas coisas que o MPTT pode fazer imediatamente que uma solução de caminho armazenado não fará:

ermite o cálculo da contagem de subnós para cada nó sem nenhuma consulta adicional (mencionada acima Impõe um pedido em nós em um determinado nível. As outras soluções são desordenadas.

questionAnswers(2)

yourAnswerToTheQuestion