Maison  >  Article  >  développement back-end  >  Méthode de stockage de structure de données arborescente (requête)

Méthode de stockage de structure de données arborescente (requête)

藏色散人
藏色散人avant
2019-09-07 11:05:303296parcourir

Modèle de liste de contiguïté

Dans le développement commercial quotidien, nous rencontrons souvent des données arborescentes avec une structure hiérarchique. Lorsqu'elle est stockée dans une base de données relationnelle, cette structure de données est souvent stockée dans un modèle appelé liste de contiguïté, comme ceci :

CREATE TABLE `categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(100) NOT NULL,
  `pid` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

Méthode de stockage de structure de données arborescente (requête)

Ce modèle représente L'image montre :

Méthode de stockage de structure de données arborescente (requête)

Je pense que beaucoup de gens connaissent déjà ce modèle de données, je n'entrerai donc pas trop dans les détails ici. Concentrons-nous sur le modèle de données suivant

Modèle d'ensemble imbriqué

Une autre façon de représenter un arbre est de le stocker sous forme d'ensemble. Nous redéfinissons la structure de table suivante :

CREATE TABLE `categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(100) NOT NULL,
  `lft` int(11) NOT NULL UNIQUE CHECK (lft> 0),
  `rgt` int(11) NOT NULL UNIQUE CHECK (rgt> 1),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

Méthode de stockage de structure de données arborescente (requête)

Et le schéma de ce modèle ressemblera à ce qui suit :

Méthode de stockage de structure de données arborescente (requête)

lft et rgt sont utilisés comme limite de l'ensemble. Plus la différence entre les deux est grande, plus l'ensemble est grand et plus il contient d'éléments.

Selon le sous-ensemble, trouvez la catégorie du parent

SELECT c2.* 
  FROM categories as c1, categories as c2
  WHERE c1.lft BETWEEN c2.lft and c2.rgt 
      AND c1.title = '华为';
+----+-------------+-----+-----+
| id | title       | lft | rgt |
+----+-------------+-----+-----+
|  1 | Smartphones |   1 |  14 |
|  5 | Harmony OS  |  10 |  13 |
|  8 | 华为        |  11 |  12 |
+----+-------------+-----+-----+

Selon le parent, trouvez tous les sous-ensembles en dessous

SELECT c1.*
   FROM categories AS c1, categories AS c2
  WHERE c1.lft BETWEEN c2.lft AND c2.rgt
    AND c2.title = 'Smartphones';
+----+-------------+-----+-----+
| id | title       | lft | rgt |
+----+-------------+-----+-----+
|  1 | Smartphones |   1 |  14 |
|  3 | Android     |   2 |   5 |
|  4 | iOS         |   6 |   9 |
|  5 | Harmony OS  |  10 |  13 |
|  6 | 小米        |   3 |   4 |
|  7 | iPhone      |   7 |   8 |
|  8 | 华为        |  11 |  12 |
+----+-------------+-----+-----+

Voir le niveau de chaque catégorie

 SELECT COUNT(c2.id) AS indentation, c1.title
  FROM categories AS c1, categories AS c2下周三we'fv
  WHERE c1.lft BETWEEN c2.lft AND c2.rgt
  GROUP BY c1.title
  ORDER BY c1.lft;
+-------------+-------------+
| indentation | title       |
+-------------+-------------+
|           1 | Smartphones |
|           2 | Android     |
|           3 | 小米        |
|           2 | iOS         |
|           3 | iPhone      |
|           2 | Harmony OS  |
|           3 | 华为        |
+-------------+-------------+

Avantages et inconvénients

Modèle de liste de contiguïté

Le modèle de liste de contiguïté est facile à comprendre et le code dont nous avons besoin l'est également très simple.

Mais dans la plupart des langages de programmation, c'est lent et inefficace. Ceci est principalement dû à la récursion. Nous devons effectuer une requête de base de données pour chaque nœud de l'arborescence.

Cela peut rendre la fonction très lente lorsqu'il s'agit de grands arbres puisque chaque requête prend un certain temps. Car pour chaque fonction, un algorithme récursif est nécessaire pour obtenir le nombre.

Bien sûr, si vous utilisez un langage récursif comme List, vous pouvez ignorer les lacunes de ce modèle de données. Mais pour PHP, cela rendra l’ensemble du traitement de ce modèle de données extrêmement lent.

Modèle d'ensemble imbriqué

Comparé au modèle de liste de contiguïté, ce modèle de données n'est évidemment pas si facile à comprendre. Et il ne peut pas être aussi simple d'ajouter des données. Il faut calculer les valeurs sur les côtés gauche et droit lors de l'ajout et déplacer les valeurs suivantes, ce qui augmente la pression de l'ajout de données.

De même, l'avantage qu'il apporte est qu'il vous permet de compléter une requête arborescente avec une simple requête, et vous pouvez calculer le nombre de sous-éléments qu'elle contient en fonction des deux paramètres lft et rgt.

Résumé

Les deux modèles ont leurs propres avantages et inconvénients, l'un est meilleur que l'insertion et l'autre est meilleur que la requête. Bien que je préfère le modèle d’ensembles imbriqués, il doit néanmoins être choisi en fonction de l’activité spécifique.

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer