PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

clonage de données hiérarchiques

Tirer ce résultat de manière récursive est délicat (bien que possible). Cependant, ce n'est généralement pas très efficace et il y a beaucoup meilleur moyen de résoudre ce problème.

Fondamentalement, vous augmentez le tableau avec une colonne supplémentaire qui trace l'arbre vers le haut - je l'appellerai la "Upchain". C'est juste une longue chaîne qui ressemble à ceci :

name | id | parent_id | upchain
root1 | 1 | NULL | 1:
root2 | 2 | NULL | 2:
root1sub1 | 3 | 1 | 1:3:
root1sub2 | 4 | 1 | 1:4:
root2sub1 | 5 | 2 | 2:5:
root2sub2 | 6 | 2 | 2:6:
root1sub1sub1 | 7 | 3 | 1:3:7:

Il est très facile de maintenir ce champ à jour en utilisant un déclencheur sur la table. (Excuses pour la terminologie, mais j'ai toujours fait cela avec SQL Server). Chaque fois que vous ajoutez ou supprimez un enregistrement, ou mettez à jour le champ parent_id, il vous suffit de mettre à jour le champ upchain sur cette partie de l'arborescence. C'est un travail trivial car il vous suffit de prendre la chaîne ascendante de l'enregistrement parent et d'ajouter l'identifiant de l'enregistrement actuel. Tous les enregistrements enfants sont facilement identifiés à l'aide de LIKE pour vérifier les enregistrements avec la chaîne de départ dans leur chaîne ascendante.

Ce que vous faites effectivement, c'est échanger un peu d'activité d'écriture supplémentaire contre un gros enregistrement lorsque vous venez de lire les données.

Quand on veut sélectionner une branche complète dans l'arbre c'est trivial. Supposons que vous vouliez la branche sous le nœud 1. Le nœud 1 a une chaîne montante '1:', vous savez donc que tout nœud de la branche de l'arborescence sous ce nœud doit avoir une chaîne montante commençant par '1:...'. Donc tu fais juste ça :

SELECT *
FROM table
WHERE upchain LIKE '1:%'

C'est extrêmement rapide (indexez le champ upchain bien sûr). En prime, cela rend également de nombreuses activités extrêmement simples, telles que la recherche d'arbres partiels, le niveau dans l'arbre, etc.

Je l'ai utilisé dans des applications qui suivent de grandes hiérarchies de rapports d'employés, mais vous pouvez l'utiliser pour à peu près n'importe quelle structure arborescente (ventilation des pièces, etc.)

Remarques (pour tous ceux qui sont intéressés) :

  • Je n'ai pas donné le code SQL étape par étape, mais une fois que vous avez compris le principe, c'est assez simple à mettre en œuvre. Je ne suis pas un grand programmeur, donc je parle d'expérience.
  • Si vous avez déjà des données dans le tableau, vous devez effectuer une mise à jour unique pour synchroniser initialement les chaînes ascendantes. Encore une fois, ce n'est pas difficile car le code est très similaire au code UPDATE dans les déclencheurs.
  • Cette technique est également un bon moyen d'identifier les références circulaires qui pourraient autrement être difficiles à repérer.