PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Árvore de classificação com um caminho materializado?


Acredito que seu caminho materializado não está certo.

Que lógica você tem para classificar coisas assim
1
1.2
1
1.5

Por que o segundo 1 não está junto com o primeiro?

Se você tinha
1
1.2
2
2.5

Isso seria banal.

EDIT:Eu olhei para o seu exemplo e você não está armazenando o caminho materializado de uma linha, mas você está armazenando um caminho materializado da linha pai. Veja como o caminho materializado da linha realmente deve se parecer. Classificar diretamente no matpath funcionaria se você não tivesse mais de 9 branches se o armazenasse como:
 id | parent_id | matpath   |          created
----+-----------+-----------+----------------------------
  2 |         1 | 1.2       | 2010-05-08 15:18:37.987544
  6 |         2 | 1.2.6     | 2010-05-08 17:50:43.288759
  8 |         6 | 1.2.6.8   | 2010-05-09 14:01:17.632695
  3 |         1 | 1.3       | 2010-05-08 17:38:14.125377
  4 |         1 | 1.4       | 2010-05-08 17:38:57.26743
  5 |         1 | 1.5       | 2010-05-08 17:43:28.211708
  9 |         5 | 1.5.9     | 2010-05-09 14:02:43.818646
  7 |         1 | 1.7       | 2010-05-08 18:18:11.849735

caso contrário (>9) você teria que ativar o matpath em algo como
001.002.006
001.002.006.008

que suportaria até 999 filiais.

Observe
  • até mesmo a abordagem com 4 dígitos fixos, como 0001.0002.0006 daria a você um campo menor do que na resposta aceita
  • você pode analisar matpath e produzir um valor de classificação em tempo real com uma função de usuário
  • você pode armazenar diretamente o matpath neste formato (ele também tem outras propriedades interessantes)