Mysql树型结构2种方式及相互转换_MySQL
Mysql实现树型结构,数据库上常见有2种方式:领接表、预排序遍历树(MPTT)。
领接表方式——
主要依赖于一个 parent 字段,用于指向上级节点,将相邻的上下级节点连接起来,id 为自动递增自动,parent_id 为上级节点的 id。
领接表方式的优点在于容易理解,代码也比较简单明了。缺点则是递归中的 SQL 查询会导致负载变大,特别是需要处理比较大型的树状结构的时候,查询语句会随着层级的增加而增加,WEB 应用的瓶颈基本都在数据库方面,所以这是一个比较致命的缺点,直接导致树结构的扩展困难重重。
排序遍历树方式
现在我们来聊聊第二种方式─预排序遍历树方式(即通常所说的 MPTT,Modified Preorder Tree Traversal)。此算法是在第一种方式的基础之上,给每个节点增加一个左、右数字,用于标识节点的遍历顺序,如下图所示:
vcq9yrXA/Q==" title="PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例" />
从根节点开始左边为 1,然后下一个节点的左边为 2,以此类推,到最低层节点之后,最低层节点的右边为其左边的数字加 1。顺着这些节点,我们可以很容易地遍历完整个树。根据上图,我们对数据表做一些改变,增加两个字段,lft 和 rgt 用于存储左右数字( left 和 right 是 MySQL 的保留字,所以改用简写)。
可以看出,由于MPTT方式存储不仅包含隶属关系,还包括了顺序,因此在读取子树时不需递归,效率大大提高。
下面面讨论下如何在这两着间转换.
MPTT转领接表比较容易,只要寻找层级比当前节点小1,且lft当前节点rgt的节点,即为父节点。
领接表转MPTT,一般直观想到的是递归生成。但是这个不是尾递归,递归层数有限制, mysql没有数组自建堆栈要用表,效率很低,怎么办?
笔者设计了一个近似递推的算法,分享一下:
首先确定问题:领接表结构(id,pid),目标MPTT表结构(id,lvl,lft,rgt)。
为处理需要,MPTT表增加cnt、seq字段,用于记录节点及其子节点的个数、在MPTT中遍历的序号。
处理过程算法如下:
1】根节点,转入MPTT表,令lvl=1,lft=1,rgt=null,cnt=null,seq=1;
2】逐层处理p的子节点,lvl+1;
3】从最底层(lvl最大)向上(lvl递减)处理各层的节点,cnt=子节点的cnt数+1
4】从最上曾(lvl=1)向下(lvl递增)处理各层的节点,seq=父节点seq+ sum(id小于本节点的兄弟节点的cnt)+1
5】对每一个节点,lft=seq*2-lvl,rgt = lft +cnt *2 -1
处理结束;
此算法已在项目中应用,代码是有版权的,就不贴了。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

L'expression Lambda est une fonction anonyme sans nom et sa syntaxe est la suivante : (parameter_list) -> expression. Ils présentent l’anonymat, la diversité, le curry et la fermeture. Dans des applications pratiques, les expressions Lambda peuvent être utilisées pour définir des fonctions de manière concise, comme la fonction de sommation sum_lambda=lambdax,y:x+y, et appliquer la fonction map() à la liste pour effectuer l'opération de sommation.

La structure et la technologie de base d'Internet proviennent d'ARPANET. ARPANET constitue une étape importante dans le développement de la technologie des réseaux informatiques. Ses résultats de recherche ont joué un rôle important dans la promotion du développement de la technologie des réseaux et ont jeté les bases de la formation d'Internet. Arpanet (Arpanet) a été le premier réseau de commutation de paquets opérationnel au monde développé par la Defense Advanced Research Projects Agency des États-Unis. Il est l'ancêtre de l'Internet mondial.

En tant que langage de programmation moderne, le langage Go joue un rôle important dans le développement. Le langage Go fournit des fonctions et des structures temporelles intégrées pour rendre le traitement du temps plus pratique. Dans cet article, nous présenterons quelques méthodes de traitement du temps couramment utilisées dans le langage Go. time.Now() Nous pouvons utiliser la fonction time.Now() pour obtenir l'heure actuelle : now:=time.Now()fmt.Println(now) sortie : 2019-06-131

Comment utiliser HTML et CSS pour implémenter une mise en page avec un menu de navigation fixe. Dans la conception Web moderne, les menus de navigation fixes sont l'une des mises en page courantes. Il peut maintenir le menu de navigation toujours en haut ou sur le côté de la page, permettant aux utilisateurs de parcourir facilement le contenu Web. Cet article explique comment utiliser HTML et CSS pour implémenter une mise en page avec un menu de navigation fixe et fournit des exemples de code spécifiques. Tout d'abord, vous devez créer une structure HTML pour présenter le contenu de la page Web et le menu de navigation. Voici un exemple simple

La table MySQL.proc est une table système qui stocke les informations sur les procédures et les fonctions stockées dans la base de données MySQL. Grâce à une compréhension approfondie de sa structure et de son objectif, vous pouvez mieux comprendre le mécanisme de fonctionnement des procédures et des fonctions stockées dans MySQL et effectuer les opérations associées. gestion et optimisation. La structure et l'objectif de la table MySQL.proc seront analysés en détail ci-dessous et des exemples de code spécifiques seront fournis. 1. La structure de la table MySQL.proc La table MySQL.proc est une table système qui stocke les définitions et les informations associées de toutes les procédures et fonctions stockées.

Comment concevoir la structure de la table d'évaluation du centre commercial dans MySQL ? Dans un système de centre commercial, l’évaluation est l’une des fonctions les plus importantes. Les évaluations peuvent non seulement fournir une référence aux autres utilisateurs, mais également aider les commerçants à comprendre les commentaires et les opinions des utilisateurs sur les produits. La conception d'une structure de formulaire d'évaluation raisonnable est cruciale pour le fonctionnement du système du centre commercial et l'expérience utilisateur. Cet article explique comment concevoir la structure de la table d'évaluation du centre commercial dans MySQL et fournit des exemples de code spécifiques. Tout d’abord, nous devons créer deux tables de base : la table des produits et la table des utilisateurs. liste de produits (produit

Chrome enregistrera automatiquement les URL qui ont été saisies dans la barre d'adresse et « associera automatiquement le contenu de la requête » à l'avenir, mais souvent, nous n'avons pas besoin de certaines URL, comment les supprimer ? L'éditeur rencontre souvent ce problème. Les adresses saisies auparavant seront bloquées devant les adresses couramment utilisées, ce qui nécessitera de sélectionner plusieurs fois pour accéder au site Web souhaité. J'ai cherché comment le supprimer au moins trois fois car... je l'oublie à chaque fois. Dans les raccourcis de la barre d'adresse de l'aide officielle de Chrome Raccourcis clavier Chrome, la touche de raccourci de suppression est clarifiée : ▍Windows supprime le contenu de l'association de la barre d'adresse. Appuyez sur la touche fléchée vers le bas pour mettre en surbrillance le contenu correspondant, puis appuyez sur la touche Maj+Supprimer ▍macOS. supprime le contenu de l'association du bar d'adresse cliquez vers le bas

Il existe quatre structures de contrôle de flux courantes en Python, à savoir la structure séquentielle, la structure conditionnelle, la structure en boucle et la structure de saut. Ce qui suit les présentera un par un et fournira des exemples de code correspondants. Structure séquentielle : Une structure séquentielle est une structure dans laquelle le programme est exécuté dans un ordre prédéterminé de haut en bas, sans mots-clés ni syntaxe spécifiques. Exemple de code : print("Voici l'exemple de structure de séquence 1")print("Voici l'exemple de structure de séquence 2")print("Voici l'exemple de structure de séquence 2")
