โครงสร้างฐานข้อมูลสำหรับโครงสร้างข้อมูลแบบต้นไม้


151

อะไรจะเป็นวิธีที่ดีที่สุดในการใช้โครงสร้างข้อมูลแบบต้นไม้ที่มีจำนวนระดับที่ไม่ทราบค่าในฐานข้อมูล

ฉันทำสิ่งนี้ครั้งเดียวก่อนที่จะใช้ตารางที่มี foreign key เป็นของตัวเอง

คุณเห็นการปรับใช้อื่นใดและการใช้งานนี้สมเหตุสมผลหรือไม่



SQL Server (ตั้งแต่ปี 2008) นำเสนอประเภทข้อมูลลำดับชั้น
BornToCode

คำตอบ:


80

คุณพูดถึงการใช้งานบ่อยที่สุดซึ่งเป็นรายการ Adjacency: https://blogs.msdn.microsoft.com/mvpawardprogram/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets

มีโมเดลอื่น ๆ เช่นกันรวมถึงเส้นทาง materialized และชุดซ้อน: http://communities.bmc.com/communities/docs/DOC-9902

Joe Celko ได้เขียนหนังสือเกี่ยวกับเรื่องนี้ซึ่งเป็นการอ้างอิงที่ดีจากมุมมอง SQL ทั่วไป (ซึ่งถูกกล่าวถึงในลิงก์บทความชุดซ้อนด้านบน)

นอกจากนี้ Itzik Ben-Gann ยังมีภาพรวมที่ดีของตัวเลือกที่พบบ่อยที่สุดในหนังสือ "Inside Microsoft SQL Server 2005: T-SQL Querying"

สิ่งสำคัญที่ควรพิจารณาเมื่อเลือกรุ่นคือ:

1) ความถี่ของการเปลี่ยนแปลงโครงสร้าง - ความถี่ที่แท้จริงของโครงสร้างต้นไม้เปลี่ยนแปลงบ่อยเพียงใด บางรุ่นมีคุณสมบัติการปรับปรุงโครงสร้างที่ดีกว่า สิ่งสำคัญคือต้องแยกการเปลี่ยนแปลงโครงสร้างจากการเปลี่ยนแปลงข้อมูลอื่น ๆ ตัวอย่างเช่นคุณอาจต้องการสร้างโมเดลแผนผังองค์กรของ บริษัท บางคนจะทำแบบจำลองนี้เป็นรายการคำสรรพนามโดยใช้รหัสพนักงานเพื่อเชื่อมโยงพนักงานกับหัวหน้างานของพวกเขา นี่เป็นวิธีที่ดีที่สุดย่อย วิธีการที่มักจะทำงานได้ดีกว่าคือการสร้างแบบจำลองโครงสร้างองค์กรแยกต่างหากจากตัวพนักงานเองและรักษาพนักงานให้เป็นคุณลักษณะของโครงสร้าง วิธีนี้เมื่อพนักงานออกจาก บริษัท โครงสร้างองค์กรเองไม่จำเป็นต้องเปลี่ยนแปลงเพียงแค่การเชื่อมโยงกับพนักงานที่เหลือ

2) ต้นไม้เขียนหนักหรืออ่านหนัก - โครงสร้างบางอย่างทำงานได้ดีมากเมื่ออ่านโครงสร้าง แต่มีค่าใช้จ่ายเพิ่มเติมเมื่อเขียนลงในโครงสร้าง

3) ข้อมูลประเภทใดที่คุณจำเป็นต้องได้รับจากโครงสร้าง - โครงสร้างบางอย่างมีความเหนือกว่าในการให้ข้อมูลบางประเภทเกี่ยวกับโครงสร้าง ตัวอย่างรวมถึงการค้นหาโหนดและลูกทั้งหมดของการค้นหาโหนดและผู้ปกครองทั้งหมดการค้นหาจำนวนโหนดเด็กที่ตรงกับเงื่อนไขบางอย่าง ฯลฯ คุณจำเป็นต้องรู้ว่าข้อมูลใดบ้างที่จะต้องใช้จากโครงสร้างเพื่อกำหนดโครงสร้างที่เหมาะสมที่สุด ความต้องการของคุณ


สวัสดีฉันกำลังเผชิญกับปัญหาเดียวกันนี้ที่ระบุไว้ในคำถามและต้องการถามคำถามเกี่ยวกับหัวข้อข้างต้น เมื่อพิจารณาถึงโครงสร้างในหัวข้อหมายเลขหนึ่ง (ตารางโครงสร้างขององค์กร (ไม่ใช่โครงสร้างของพนักงาน) ที่มี ParentId ที่อ้างอิงในตารางเดียวกัน) ฉันต้องกำหนดว่าใครคือหัวหน้าของพื้นที่ใดพื้นที่หนึ่ง ฉันจะมอบหมายให้พนักงานทุกคนในพื้นที่เฉพาะนั้นโดยตรง คุณจะวางหัวหน้าของพื้นที่นั้นไว้ที่ไหน ภายในพื้นที่เดียวกันหรือหนึ่ง gorup ด้านบน? แนวทางของฉันคือการอ้างอิงเขา / เธอกับกลุ่มข้างต้นซึ่งทำให้ฉันมีโครงสร้างที่ดีกว่าที่ฉันคิด ขอบคุณ
Marcos Buarque

1
ดูเหมือนว่าลิงก์แรกจะใช้งานไม่ได้
Jorge Leitao

คำตอบที่ยอดเยี่ยม ขอบคุณ @JeremyDWill!
bobocopy

56

มีลักษณะที่จัดการข้อมูลลำดับชั้นใน MySQL มันอธิบายวิธีการสองวิธีสำหรับการจัดเก็บและจัดการข้อมูลลำดับชั้น (เหมือนต้นไม้) ในฐานข้อมูลเชิงสัมพันธ์

วิธีแรกคือรูปแบบรายการ adjacency ซึ่งเป็นสิ่งที่คุณอธิบายเป็นหลัก: มีคีย์ต่างประเทศที่อ้างอิงถึงตารางเอง ในขณะที่วิธีนี้ง่าย แต่อาจไม่มีประสิทธิภาพสำหรับข้อความค้นหาบางอย่างเช่นการสร้างต้นไม้ทั้งหมด

วิธีที่สองที่กล่าวถึงในบทความคือโมเดลชุดที่ซ้อนกัน วิธีนี้มีประสิทธิภาพและยืดหยุ่นมากกว่า อ้างถึงบทความสำหรับคำอธิบายโดยละเอียดและแบบสอบถามตัวอย่าง


ลิงก์ของคุณมีหัวข้อที่น่าสนใจ ขอบคุณ!
ฟริตซ์

9

หากคุณต้องใช้ Relational DataBase เพื่อจัดระเบียบโครงสร้างข้อมูลแบบต้นไม้ Postgresql มีโมดูล ltree ที่ให้ประเภทข้อมูลสำหรับการแสดงเลเบลของข้อมูลที่เก็บไว้ในโครงสร้างแบบต้นไม้ที่มีลำดับชั้น คุณสามารถรับแนวคิดได้จากที่นั่น (สำหรับข้อมูลเพิ่มเติมดูที่: http://www.postgresql.org/docs/9.0/static/ltree.html )

โดยทั่วไปจะใช้ LDAP เพื่อจัดระเบียบระเบียนในโครงสร้างแบบลำดับชั้น


2

การมีโต๊ะที่มีกุญแจต่างประเทศอยู่นั้นทำให้ฉันรู้สึกไม่สมเหตุสมผล

จากนั้นคุณสามารถใช้นิพจน์ตารางทั่วไปใน SQL หรือการเชื่อมต่อโดยคำสั่งก่อนหน้าใน Oracle เพื่อสร้างแผนผังของคุณ


ฉันมีตารางบันทึกที่มีคอลัมน์ข้อมูลประจำตัว LogID และคอลัมน์ ParentLogID ที่มี FK ที่ชี้กลับไปที่คอลัมน์ LogID เมื่อแถวการบันทึกแรกในธุรกรรมถูกเขียนฉันคว้า SCOPE_IDENTITY () บันทึกบันทึกอื่น ๆ ทั้งหมดเขียนด้วยค่านี้ในคอลัมน์ ParentLogID สิ่งนี้มีประโยชน์มากสำหรับการจัดกลุ่มแถวที่อยู่ด้วยกัน มันเป็นวิธีเดียวที่จะเห็นสิ่งที่เกิดขึ้นโดยปราศจากสิ่งนี้มันจะเป็นความยุ่งเหยิงอย่างใหญ่หลวงของแถวบันทึกจากการทำธุรกรรมหลายอย่าง
กม.

@KM - เขากล่าวว่า "ไม่เข้าท่า" ไม่ได้ "ไม่ได้ทำให้รู้สึก"
จอห์น Rasch



0

หากใครก็ตามที่ใช้MS SQL Server 2008 และที่ดินสูงกว่าในคำถามนี้: SQL Server 2008 และสูงกว่ามีคุณลักษณะ "hierarchyId" ใหม่ที่ออกแบบมาสำหรับงานนี้โดยเฉพาะ

ข้อมูลเพิ่มเติมที่https://docs.microsoft.com/en-us/sql/relational-databases/hierarchical-data-sql-server

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.