Supposons qu'il existe une structure de données plate contenant des colonnes telles que « Id », « Name », « ParentId » et « Order », et que l'objectif est de créer efficacement une structure arborescente. Si seules les structures de données de base telles que les tableaux et les tables de hachage sont disponibles, une approche valide inclut :
Bien que la structure de table plate mentionnée dans la question soit une approche courante, il existe d'autres moyens d'optimiser le stockage arborescent dans les bases de données relationnelles :
1. Tableau de clôture :
Les tables de fermeture stockent explicitement chaque relation ancêtre-descendant. Cela permet une récupération efficace des descendants ou des ancêtres à l'aide de requêtes SQL.
Exemple :
<code class="language-sql">CREATE TABLE ClosureTable ( ancestor_id INT REFERENCES MyTable(id), descendant_id INT REFERENCES MyTable(id), PRIMARY KEY (ancestor_id, descendant_id) );</code>
2. Ensemble imbriqué :
Les ensembles imbriqués attribuent une plage entière à chaque nœud de l'arborescence. L'intervalle de plage définit la position du nœud dans la hiérarchie arborescente.
Exemple :
Tableau :
<code class="language-sql">CREATE TABLE NestedSets ( id INT PRIMARY KEY, left_value INT, right_value INT );</code>
Arborescence :
<code> |-----| [0, 9] |-----| | | | | |-----| |-----| |-----| | [0, 2] | | [4, 6] | | [8, 9] | | | | | | | |-----| |-----| |-----| |-----| | [0, 1] | | [2, 3] | | [4, 5] | | [6, 7] | | | | | | | | | | [0, 0] | | [2, 2] | | [4, 4] | | [6, 6] |</code>
3. Liste de contiguïté :
La liste de contiguïté représente l'arborescence sous forme de tableau avec deux colonnes : id et parent_id. Chaque ligne représente un nœud et la colonne parent_id pointe vers son nœud parent.
Exemple :
<code class="language-sql">CREATE TABLE AdjacencyList ( id INT PRIMARY KEY, parent_id INT REFERENCES AdjacencyList(id) );</code>
Le choix de la technologie d'optimisation du stockage arborescent dépend de facteurs tels que la taille des données, le mode de requête et les exigences de performances de la base de données.
Question supplémentaire : Oui, il existe des façons fondamentalement meilleures de stocker des structures arborescentes dans un SGBDR en utilisant les techniques décrites ci-dessus (tables de fermeture, ensembles imbriqués, listes de contiguïté).
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!