Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menghuraikan Jadual Rata ke dalam Struktur Pokok Bersarang dengan Cekap?

Bagaimanakah Saya Boleh Menghuraikan Jadual Rata ke dalam Struktur Pokok Bersarang dengan Cekap?

Barbara Streisand
Barbara Streisandasal
2025-01-25 06:09:09987semak imbas

How Can I Efficiently Parse a Flat Table into a Nested Tree Structure?

Menghuraikan jadual rata ke dalam struktur pokok dengan cekap

Pengenalan

Tukar jadual rata yang mewakili hierarki pokok kepada struktur bersarang dengan cekap, yang boleh dicapai menggunakan pelbagai kaedah. Artikel ini meneroka pendekatan minimalis menggunakan struktur data asas dan mempertimbangkan kaedah penyimpanan pangkalan data alternatif untuk mengoptimumkan perwakilan pokok.

Kaedah analisis minimalis

Andaikan jadual mengandungi data berikut:

Id Name ParentId Order
1 'Node 1' 0 10
2 'Node 1.1' 1 10
3 'Node 2' 0 20
4 'Node 1.1.1' 2 10
5 'Node 2.1' 3 10
6 'Node 1.2' 1 20

Harai jadual ini menjadi struktur pokok:

  1. Buat kamus: Petakan Id setiap nod kepada data yang sepadan.

  2. Kenal pasti nod punca: Nod punca ialah nod tanpa ParentId.

  3. Bina pepohon: Bina pepohon dengan mencipta nod anak secara rekursif dan menambahkannya pada nod induk yang sepadan.

    • Untuk setiap nod bukan akar, gunakan ParentIdnya untuk mencari nod induknya dalam kamus.
    • Tambahkan nod sebagai anak kepada nod induk.
  4. Isih nod anak: Isih nod anak setiap nod mengikut Susunan nod anak.

Pseudokod untuk kaedah ini:

<code>创建字典(table)
def 获取根节点():
    根节点 = []
    对于 id, 节点 in 字典.items():
        如果 节点['ParentId'] == 0:
            根节点.append(节点)
    返回 根节点

def 构建树(根节点):
    对于 根节点 in 根节点:
        子节点 = []
        对于 id, 节点 in 字典.items():
            如果 节点['ParentId'] == 根节点['Id']:
                子节点.append(节点)
        子节点.sort(key=lambda x: x['Order'])
        根节点['children'] = 子节点
        构建树(子节点)

def 打印树(根节点):
    对于 根节点 in 根节点:
        打印(根节点['Name'])
        如果 'children' in 根节点:
            打印树(根节点['children'])</code>

Kaedah penyimpanan alternatif untuk struktur pokok dalam SQL

Meja penutup:

Cara lain untuk menyimpan struktur pokok dalam pangkalan data hubungan ialah menggunakan jadual penutupan, yang mengandungi jadual berasingan yang mengandungi ID nod nenek moyang dan lajur ID nod keturunan. Ini membolehkan pertanyaan mudah tentang perhubungan.

Pertanyaan menggunakan jadual penutupan:

<code>SELECT f.name, GROUP_CONCAT(b.ancestor_id order by b.path_length desc) AS breadcrumbs
FROM FlatTable f 
JOIN ClosureTable a ON (f.id = a.descendant_id) 
JOIN ClosureTable b ON (b.descendant_id = a.descendant_id) 
WHERE a.ancestor_id = 1 
GROUP BY a.descendant_id 
ORDER BY f.name</code>

Set bersarang:

Set bersarang melibatkan penyimpanan maklumat lokasi setiap nod dalam pepohon dalam satu jadual. Kaedah ini membenarkan pertanyaan berasaskan julat yang cekap bagi nod dalam tahap atau subpokok tertentu.

Kesimpulan

Walaupun contoh yang disediakan menggunakan jadual rata sebagai input, kaedah yang dicadangkan berfungsi dengan baik dengan struktur data dan kaedah storan yang berbeza. Dengan menggunakan teknik yang sesuai, anda boleh menghuraikan hierarki pokok dengan cekap dan memastikan integriti data dan kemudahan akses.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghuraikan Jadual Rata ke dalam Struktur Pokok Bersarang dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn