Maison > développement back-end > tutoriel php > Méthode de stockage de structure de données arborescente (CUD)

Méthode de stockage de structure de données arborescente (CUD)

藏色散人
Libérer: 2023-04-07 11:54:02
avant
2855 Les gens l'ont consulté

L'article précédent a brièvement présenté le modèle de données des collections imbriquées et la méthode de requête Portal : Méthode de stockage de structure de données arborescente (requête)

Créer

Dans le modèle de collection imbriquée, chaque donnée est en fait un nœud, et chaque nœud occupe des valeurs de 2 bits. Par exemple, commençons par ajouter un nœud de premier niveau pour Smartphones.

INSERT INTO `categories` (`title`, `lft`, `rgt`) VALUES('Smartphones', 1, 2);
Copier après la connexion

Smartphones En tant que nœud maître (racine), son lft doit être 1, et la valeur de rgt augmentera à mesure que le nombre d'éléments enfants dans sa collection augmente.

Maintenant, nous souhaitons ajouter un élément enfant Android dans les smartphones. Utilisez des procédures stockées MySQL.

LOCK TABLE categories WRITE;
SELECT @root_left := lft FROM categories WHERE title = 'Smartphones';
UPDATE categories SET rgt = rgt + 2 WHERE rgt > @root_left;
UPDATE categories SET lft = lft + 2 WHERE lft > @root_left;
INSERT INTO categories (title, lft, rgt) VALUES('Android', @root_left + 1, @root_left + 2);
UNLOCK TABLES;
SELECT `title`, `lft`, `rgt` FROM `categories`;
+-------------+-----+-----+
| title       | lft | rgt |
+-------------+-----+-----+
| Smartphones |   1 |   4 |
| Android     |   2 |   3 |
+-------------+-----+-----+
Copier après la connexion

Nous essayons d'ajouter à nouveau un sous-élément Xiaomi à Android :

LOCK TABLE categories WRITE;
SELECT @root_left := lft FROM categories WHERE title = 'Android';
UPDATE categories SET rgt = rgt + 2 WHERE rgt > @root_left;
UPDATE categories SET lft = lft + 2 WHERE lft > @root_left;
INSERT INTO categories (title, lft, rgt) VALUES('小米', @root_left + 1, @root_left + 2);
UNLOCK TABLES;
SELECT `title`, `lft`, `rgt` FROM `categories`;
+-------------+-----+-----+
| title       | lft | rgt |
+-------------+-----+-----+
| Smartphones |   1 |   6 |
| Android     |   2 |   5 |
| 小米        |   3 |   4 |
+-------------+-----+-----+
Copier après la connexion

À ce stade, nous essayons d'ajouter un sous-élément iOS aux smartphones. Auparavant, nous l'avons ajouté à l'intérieur. Un élément Android, nous devons donc ici ajuster la procédure stockée et insérer iOS sur le côté droit d'Android. C'est le processus inverse d'ajout de nouveaux nœuds. Nous introduisons une largeur pour mesurer la largeur du nœud, qui s'exprime comme suit : rgt. - lft + 1. On peut donc écrire la procédure stockée comme ceci :

LOCK TABLE categories WRITE;
SELECT @next_right := rgt FROM categories WHERE title = 'Android';
UPDATE categories SET rgt = rgt + 2 WHERE rgt > @next_right;
UPDATE categories SET lft = lft + 2 WHERE lft > @next_right;
INSERT INTO categories(title, lft, rgt) VALUES('iOS', @next_right + 1, @next_right + 2);
UNLOCK TABLES;
SELECT `title`, `lft`, `rgt` FROM `categories`;
+-------------+-----+-----+
| title       | lft | rgt |
+-------------+-----+-----+
| Smartphones |   1 |   8 |
| Android     |   2 |   5 |
| 小米        |   3 |   4 |
| iOS         |   6 |   7 |
+-------------+-----+-----+
Copier après la connexion

Mise à jour

Le déplacement de nœuds est un processus relativement compliqué Par exemple, dans. Dans la figure ci-dessous, macOS doit être classé dans la catégorie Unix.


Pour déplacer le nœud, trois étapes sont nécessaires :

1. Sortez le nœud à déplacer

2. et paramètres rgtMéthode de stockage de structure de données arborescente (CUD)

3. Déplacer le nœud vers la position spécifiée

LOCK TABLE categories WRITE;
SELECT @delete_left := lft, @delete_right := rgt, @delete_width := rgt - lft + 1
FROM categories WHERE title = 'Android';
DELETE FROM categories WHERE lft BETWEEN @delete_left AND @delete_right;
UPDATE categories SET rgt = rgt - @delete_width WHERE rgt > @delete_right;
UPDATE categories SET lft = lft - @delete_width WHERE lft > @delete_right;
UNLOCK TABLES;
SELECT `title`, `lft`, `rgt` FROM `categories`;
+-------------+-----+-----+
| title       | lft | rgt |
+-------------+-----+-----+
| Smartphones |   1 |   4 |
| iOS         |   2 |   3 |
+-------------+-----+-----+
Copier après la connexion

Résumé

En fait, le modèle de données des collections imbriquées en SQL a été proposé depuis longtemps , il existe de nombreux packages qui ont implémenté cette fonction, comme laravel-nestedset ou django-mptt

Pour une utilisation en production, il n'existe certainement pas de conception de structure de table aussi simple, ni même d'autres optimisations , comme un modèle de données appelé Il s'agit d'un tableau fermé, qui devrait être présenté à tout le monde dans cette série d'articles.

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!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal