อะไรจะเป็นวิธีที่ดีที่สุดในการใช้โครงสร้างข้อมูลแบบต้นไม้ที่มีจำนวนระดับที่ไม่ทราบค่าในฐานข้อมูล
ฉันทำสิ่งนี้ครั้งเดียวก่อนที่จะใช้ตารางที่มี foreign key เป็นของตัวเอง
คุณเห็นการปรับใช้อื่นใดและการใช้งานนี้สมเหตุสมผลหรือไม่
อะไรจะเป็นวิธีที่ดีที่สุดในการใช้โครงสร้างข้อมูลแบบต้นไม้ที่มีจำนวนระดับที่ไม่ทราบค่าในฐานข้อมูล
ฉันทำสิ่งนี้ครั้งเดียวก่อนที่จะใช้ตารางที่มี foreign key เป็นของตัวเอง
คุณเห็นการปรับใช้อื่นใดและการใช้งานนี้สมเหตุสมผลหรือไม่
คำตอบ:
คุณพูดถึงการใช้งานบ่อยที่สุดซึ่งเป็นรายการ 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) ข้อมูลประเภทใดที่คุณจำเป็นต้องได้รับจากโครงสร้าง - โครงสร้างบางอย่างมีความเหนือกว่าในการให้ข้อมูลบางประเภทเกี่ยวกับโครงสร้าง ตัวอย่างรวมถึงการค้นหาโหนดและลูกทั้งหมดของการค้นหาโหนดและผู้ปกครองทั้งหมดการค้นหาจำนวนโหนดเด็กที่ตรงกับเงื่อนไขบางอย่าง ฯลฯ คุณจำเป็นต้องรู้ว่าข้อมูลใดบ้างที่จะต้องใช้จากโครงสร้างเพื่อกำหนดโครงสร้างที่เหมาะสมที่สุด ความต้องการของคุณ
มีลักษณะที่จัดการข้อมูลลำดับชั้นใน MySQL มันอธิบายวิธีการสองวิธีสำหรับการจัดเก็บและจัดการข้อมูลลำดับชั้น (เหมือนต้นไม้) ในฐานข้อมูลเชิงสัมพันธ์
วิธีแรกคือรูปแบบรายการ adjacency ซึ่งเป็นสิ่งที่คุณอธิบายเป็นหลัก: มีคีย์ต่างประเทศที่อ้างอิงถึงตารางเอง ในขณะที่วิธีนี้ง่าย แต่อาจไม่มีประสิทธิภาพสำหรับข้อความค้นหาบางอย่างเช่นการสร้างต้นไม้ทั้งหมด
วิธีที่สองที่กล่าวถึงในบทความคือโมเดลชุดที่ซ้อนกัน วิธีนี้มีประสิทธิภาพและยืดหยุ่นมากกว่า อ้างถึงบทความสำหรับคำอธิบายโดยละเอียดและแบบสอบถามตัวอย่าง
หากคุณต้องใช้ Relational DataBase เพื่อจัดระเบียบโครงสร้างข้อมูลแบบต้นไม้ Postgresql มีโมดูล ltree ที่ให้ประเภทข้อมูลสำหรับการแสดงเลเบลของข้อมูลที่เก็บไว้ในโครงสร้างแบบต้นไม้ที่มีลำดับชั้น คุณสามารถรับแนวคิดได้จากที่นั่น (สำหรับข้อมูลเพิ่มเติมดูที่: http://www.postgresql.org/docs/9.0/static/ltree.html )
โดยทั่วไปจะใช้ LDAP เพื่อจัดระเบียบระเบียนในโครงสร้างแบบลำดับชั้น
การมีโต๊ะที่มีกุญแจต่างประเทศอยู่นั้นทำให้ฉันรู้สึกไม่สมเหตุสมผล
จากนั้นคุณสามารถใช้นิพจน์ตารางทั่วไปใน SQL หรือการเชื่อมต่อโดยคำสั่งก่อนหน้าใน Oracle เพื่อสร้างแผนผังของคุณ
คอลเลกชันที่ยอดเยี่ยมของฟังก์ชั่นที่พร้อมใช้งานซึ่งสามารถใช้กับโมเดลรายการ adjacency เพื่อทำให้ชีวิตง่ายขึ้น
http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html
ฉันใช้การติดตั้ง SQL Server 2005 ต่อไปนี้ ตรวจสอบที่นี่
หากใครก็ตามที่ใช้MS SQL Server 2008 และที่ดินสูงกว่าในคำถามนี้: SQL Server 2008 และสูงกว่ามีคุณลักษณะ "hierarchyId" ใหม่ที่ออกแบบมาสำหรับงานนี้โดยเฉพาะ
ข้อมูลเพิ่มเติมที่https://docs.microsoft.com/en-us/sql/relational-databases/hierarchical-data-sql-server