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
处理结束;
此算法已在项目中应用,代码是有版权的,就不贴了。

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Der Lambda-Ausdruck ist eine anonyme Funktion ohne Namen und seine Syntax lautet: (parameter_list)->Ausdruck. Sie zeichnen sich durch Anonymität, Vielfalt, Currying und Schließung aus. In praktischen Anwendungen können Lambda-Ausdrücke verwendet werden, um Funktionen prägnant zu definieren, beispielsweise die Summationsfunktion sum_lambda=lambdax,y:x+y, und die Funktion map() auf die Liste anzuwenden, um die Summationsoperation durchzuführen.

Die Grundstruktur und Technologie des Internets hat ihren Ursprung im ARPANET. ARPANET ist ein Meilenstein in der Entwicklung der Computernetzwerktechnologie. Seine Forschungsergebnisse haben eine wichtige Rolle bei der Förderung der Entwicklung der Netzwerktechnologie gespielt und den Grundstein für die Entstehung des Internets gelegt. Arpanet (Arpanet) war das weltweit erste betriebsbereite Paketvermittlungsnetzwerk, das von der US-amerikanischen Defense Advanced Research Projects Agency entwickelt wurde. Es ist der Vorfahre des globalen Internets.

So implementieren Sie mithilfe von HTML und CSS ein Layout mit einem festen Navigationsmenü. Im modernen Webdesign gehören feste Navigationsmenüs zu den häufigsten Layouts. Dadurch kann das Navigationsmenü immer oben oder am Rand der Seite angezeigt werden, sodass Benutzer bequem durch Webinhalte navigieren können. In diesem Artikel wird erläutert, wie Sie mithilfe von HTML und CSS ein Layout mit einem festen Navigationsmenü implementieren, und es werden spezifische Codebeispiele bereitgestellt. Zunächst müssen Sie eine HTML-Struktur erstellen, um den Inhalt der Webseite und das Navigationsmenü darzustellen. Hier ist ein einfaches Beispiel

Als moderne Programmiersprache spielt die Go-Sprache eine wichtige Rolle in der Entwicklung. Die Go-Sprache bietet einige integrierte Zeitfunktionen und -strukturen, um die Zeitverarbeitung komfortabler zu gestalten. In diesem Artikel stellen wir einige häufig verwendete Zeitverarbeitungsmethoden in der Go-Sprache vor. time.Now() Wir können die Funktion time.Now() verwenden, um die aktuelle Zeit abzurufen: now:=time.Now()fmt.Println(now) Ausgabe: 2019-06-131

Die MySQL.proc-Tabelle ist eine Systemtabelle, die gespeicherte Prozedur- und Funktionsinformationen in der MySQL-Datenbank speichert. Durch ein detailliertes Verständnis ihrer Struktur und ihres Zwecks können Sie den Funktionsmechanismus gespeicherter Prozeduren und Funktionen in MySQL besser verstehen und entsprechende Aktionen ausführen Management und Optimierung. Die Struktur und der Zweck der MySQL.proc-Tabelle werden im Folgenden detailliert analysiert und es werden spezifische Codebeispiele bereitgestellt. 1. Die Struktur der MySQL.proc-Tabelle Die MySQL.proc-Tabelle ist eine Systemtabelle, in der die Definitionen und zugehörigen Informationen aller gespeicherten Prozeduren und Funktionen gespeichert sind.

Wie entwerfe ich die Bewertungstabellenstruktur des Einkaufszentrums in MySQL? In einem Einkaufszentrumsystem ist die Bewertung eine der wichtigsten Funktionen. Bewertungen können nicht nur als Referenz für andere Nutzer dienen, sondern Händlern auch dabei helfen, das Feedback und die Meinungen der Nutzer zu Produkten zu verstehen. Die Gestaltung einer angemessenen Bewertungsformularstruktur ist für den Betrieb des Einkaufszentrumsystems und die Benutzererfahrung von entscheidender Bedeutung. In diesem Artikel wird erläutert, wie die Bewertungstabellenstruktur des Einkaufszentrums in MySQL entworfen wird, und es werden spezifische Codebeispiele bereitgestellt. Zuerst müssen wir zwei grundlegende Tabellen erstellen: Produkttabelle und Benutzertabelle. Produktliste (Produkt

Chrome zeichnet die URLs, die in die Adressleiste eingegeben wurden, automatisch auf und „verknüpft den Abfrageinhalt“ in Zukunft automatisch. Oftmals benötigen wir jedoch einige URLs nicht. Wie löscht man sie? Der Redakteur stößt häufig auf dieses Problem. Zuvor eingegebene Adressen werden vor häufig verwendeten Adressen blockiert, was dazu führt, dass die gewünschte Website mehrmals ausgewählt werden muss. Ich habe mindestens dreimal nach einer Möglichkeit gesucht, es zu löschen, weil ... ich es jedes Mal vergesse. In den Adressleisten-Verknüpfungen der offiziellen Chrome-Hilfe zu Chrome-Tastaturkürzeln wird die Löschtaste erläutert: ▍Windows löscht den Inhalt der Adressleistenzuordnung. Drücken Sie die Abwärtspfeiltaste, um den entsprechenden Inhalt zu markieren, und drücken Sie dann die Umschalt+Entf-Taste ▍macOS löscht die Adresse Inhalt der Anwaltskammer Klicken Sie nach unten

In Python gibt es vier gängige Flusskontrollstrukturen: sequentielle Struktur, bedingte Struktur, Schleifenstruktur und Sprungstruktur. Im Folgenden werden sie einzeln vorgestellt und entsprechende Codebeispiele bereitgestellt. Sequentielle Struktur: Eine sequentielle Struktur ist eine Struktur, in der das Programm in einer vorgegebenen Reihenfolge von oben nach unten ohne bestimmte Schlüsselwörter oder Syntax ausgeführt wird. Beispielcode: print("Dies ist die Sequenzstruktur, Beispiel 1")print("Dies ist die Sequenzstruktur, Beispiel 2")print("Dies ist die Sequenzstruktur, Beispiel 2")
