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

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











람다 표현식은 이름이 없는 익명 함수이며 구문은 (parameter_list)->expression입니다. 익명성, 다양성, 커링 및 폐쇄 기능이 특징입니다. 실제 응용 프로그램에서는 람다 표현식을 사용하여 합산 함수 sum_lambda=lambdax,y:x+y와 같은 함수를 간결하게 정의하고 map() 함수를 목록에 적용하여 합산 작업을 수행할 수 있습니다.

인터넷의 기본 구조와 기술은 ARPANET에서 유래되었습니다. ARPANET은 컴퓨터 네트워크 기술 발전의 이정표이며, 그 연구 결과는 네트워크 기술 발전을 촉진하고 인터넷 형성의 기반을 마련하는 데 중요한 역할을 했습니다. Arpanet(Arpanet)은 미국 국방고등연구계획국(Defense Advanced Research Projects Agency)이 개발한 세계 최초의 운용용 패킷 교환 네트워크였습니다. 글로벌 인터넷의 조상입니다.

HTML과 CSS를 사용하여 고정 탐색 메뉴가 있는 레이아웃을 구현하는 방법 최신 웹 디자인에서 고정 탐색 메뉴는 일반적인 레이아웃 중 하나입니다. 탐색 메뉴를 항상 페이지 상단이나 측면에 유지하여 사용자가 웹 콘텐츠를 편리하게 탐색할 수 있도록 합니다. 이 기사에서는 HTML과 CSS를 사용하여 고정 탐색 메뉴가 있는 레이아웃을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 먼저 웹페이지의 콘텐츠와 탐색 메뉴를 표시하는 HTML 구조를 만들어야 합니다. 다음은 간단한 예입니다.

현대 프로그래밍 언어로서 Go 언어는 개발에서 중요한 역할을 합니다. Go 언어는 시간 처리를 더욱 편리하게 만들기 위해 몇 가지 내장된 시간 함수와 구조를 제공합니다. 이 기사에서는 Go 언어에서 일반적으로 사용되는 시간 처리 방법을 소개합니다. time.Now() time.Now() 함수를 사용하여 현재 시간을 얻을 수 있습니다: now:=time.Now()fmt.Println(now) 출력: 2019-06-131

MySQL.proc 테이블은 MySQL 데이터베이스에 저장 프로시저와 함수 정보를 저장하는 시스템 테이블이다. 그 구조와 목적에 대한 심층적인 이해를 통해 MySQL의 저장 프로시저와 함수의 작동 메커니즘을 더 잘 이해하고 관련 수행을 수행할 수 있다. 관리 및 최적화. 아래에서는 MySQL.proc 테이블의 구조와 목적을 자세히 분석하고, 구체적인 코드 예시를 제공한다. 1. MySQL.proc 테이블의 구조 MySQL.proc 테이블은 모든 저장 프로시저와 함수에 대한 정의와 관련 정보를 저장하는 시스템 테이블이다.

MySQL에서 쇼핑몰의 평가 테이블 구조를 어떻게 설계하나요? 쇼핑몰 시스템에서 평가는 가장 중요한 기능 중 하나이다. 평가는 다른 사용자에게 참고 자료를 제공할 뿐만 아니라 판매자가 제품에 대한 사용자의 피드백과 의견을 이해하는 데에도 도움이 됩니다. 합리적인 평가 양식 구조를 설계하는 것은 쇼핑몰 시스템 운영과 사용자 경험에 매우 중요합니다. 본 글에서는 MySQL에서 쇼핑몰의 평가 테이블 구조를 설계하는 방법을 소개하고 구체적인 코드 예시를 제공합니다. 먼저 제품 테이블과 사용자 테이블이라는 두 가지 기본 테이블을 생성해야 합니다. 상품목록(상품

Chrome은 주소 표시줄에 입력된 URL을 자동으로 기록하고 앞으로는 자동으로 "쿼리 내용 연결"을 수행하지만 일부 URL이 필요하지 않은 경우가 많습니다. 어떻게 삭제하나요? 편집자는 종종 이런 문제에 직면하게 되는데, 이전에 입력한 주소는 자주 사용하는 주소 앞에 차단되므로 원하는 웹사이트에 들어가려면 여러 번 선택해야 하는 문제가 발생합니다. 삭제하는 방법을 3번 이상 찾아봤는데... 매번 잊어버리거든요. Chrome 공식 도움말 Chrome 키보드 단축키 중 주소 표시줄 단축키에 삭제 단축키가 명시되어 있습니다. ▍Windows에서는 주소 표시줄 연결 내용을 삭제합니다. 아래쪽 화살표 키를 눌러 해당 내용을 강조 표시한 다음 Shift+Delete 키를 누릅니다. ▍macOS 주소 표시 줄 연결 내용을 삭제합니다. 클릭 다운

Python에는 순차 구조, 조건부 구조, 루프 구조 및 점프 구조라는 네 가지 일반적인 흐름 제어 구조가 있습니다. 다음에서는 이를 하나씩 소개하고 해당 코드 예제를 제공합니다. 순차 구조(Sequential Structure): 순차 구조는 특정 키워드나 구문 없이 위에서 아래로 미리 정해진 순서대로 프로그램이 실행되는 구조이다. 샘플 코드: print("이것은 시퀀스 구조 예제 1입니다.")print("이것은 시퀀스 구조 예제 2입니다.")print("이것은 시퀀스 구조 예제 2입니다.")
