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);
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 | +-------------+-----+-----+
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 | +-------------+-----+-----+
À 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 | +-------------+-----+-----+
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 rgt
3. Déplacer le nœud vers la position spécifiéeLOCK 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 | +-------------+-----+-----+
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-mpttPour 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!