ภาพรวมที่ดี
โดยทั่วไปคุณกำลังตัดสินใจระหว่างเวลาอ่านเร็ว (ตัวอย่างเช่นชุดซ้อน) หรือเวลาเขียนเร็ว (รายการ adjacency) โดยปกติแล้วคุณจะพบกับตัวเลือกด้านล่างที่ตรงกับความต้องการของคุณมากที่สุด ต่อไปนี้จะให้การอ่านเชิงลึกบางอย่าง:
- หนึ่งช่วงเวลาซ้อนกับการเปรียบเทียบรายการ Adjacency : การเปรียบเทียบรายการ Adjacency ที่ดีที่สุด , เส้นทาง Materialized, ชุดซ้อนและช่วงซ้อนที่ฉันพบ
- แบบจำลองสำหรับข้อมูลลำดับชั้น : สไลด์พร้อมคำอธิบายที่ดีของการแลกเปลี่ยนและการใช้ตัวอย่าง
- แสดงลำดับชั้นใน MySQL : ภาพรวมที่ดีมากของชุดซ้อนโดยเฉพาะ
- ข้อมูลลำดับชั้นใน RDBMSs : ชุดลิงก์ที่ครอบคลุมและมีการจัดการที่ดีที่สุดที่ฉันเคยเห็น แต่ไม่ได้อธิบายมากนัก
ตัวเลือก
คนที่ฉันรู้จักและคุณสมบัติทั่วไป:
- รายการคำคุณศัพท์ :
- คอลัมน์: ID, ParentID
- ใช้งานง่าย
- โหนดถูกย้ายแทรกและลบ
- มีราคาแพงในการค้นหาระดับบรรพบุรุษและลูกหลานเส้นทาง
- หลีกเลี่ยง N + 1 ผ่านCommon Table Expressionsในฐานข้อมูลที่รองรับ
- ชุดซ้อน ( Traversal Tree ลำดับที่ปรับเปลี่ยนหรือที่รู้จักแล้วดัดแปลง )
- คอลัมน์: ซ้าย, ขวา
- บรรพบุรุษราคาถูกลูกหลาน
- การ
O(n/2)
เคลื่อนไหวการแทรกและการลบที่มีราคาแพงมากเนื่องจากการเข้ารหัสที่ไม่แน่นอน
- ตารางบริดจ์ (เรียกว่าปิดตาราง / ทริกเกอร์ w )
- ใช้ตารางการเข้าร่วมแยกกับ: บรรพบุรุษบรรพบุรุษความลึก (ไม่บังคับ)
- บรรพบุรุษและลูกหลานราคาถูก
- เขียนค่าใช้จ่าย
O(log n)
(ขนาดของทรีย่อย) สำหรับการแทรกการปรับปรุงการลบ - การเข้ารหัสปกติ: ดีสำหรับสถิติ RDBMS & ตัววางแผนคิวรีเข้าร่วม
- ต้องมีหลายแถวต่อโหนด
- คอลัมน์ Lineage (aka เส้นทางที่เป็นรูปธรรม , การระบุเส้นทาง)
- คอลัมน์: สายเลือด (เช่น / parent / child / grandchild / etc ... )
- ทายาทราคาถูกผ่านการค้นหาคำนำหน้า (เช่น
LEFT(lineage, #) = '/enumerated/path'
) - เขียนค่าใช้จ่าย
O(log n)
(ขนาดของทรีย่อย) สำหรับการแทรกการปรับปรุงการลบ - ไม่สัมพันธ์: อาศัยประเภทข้อมูล Array หรือรูปแบบสตริงที่ทำให้เป็นอนุกรม
- ช่วงเวลาซ้อน
- เช่นเดียวกับชุดซ้อน แต่มีจริง / ลอย / ทศนิยมเพื่อให้การเข้ารหัสไม่ผันผวน (ย้าย / แทรก / ลบราคาไม่แพง)
- มีปัญหาการแสดงจริง / ทศนิยม / ทศนิยม / ความแม่นยำ
- ตัวแปรการเข้ารหัสเมทริกซ์เพิ่มการเข้ารหัสบรรพบุรุษ (เส้นทาง materialized) สำหรับ "ฟรี" แต่เพิ่มความยุ่งยากของพีชคณิตเชิงเส้น
- โต๊ะแบน
- รายการ Adjacency ที่แก้ไขซึ่งเพิ่มคอลัมน์ระดับและอันดับ (เช่นการสั่งซื้อ) ไปยังแต่ละระเบียน
- ราคาถูกไปซ้ำ / เลขหน้ามากกว่า
- ย้ายและลบราคาแพง
- การใช้งานที่ดี: การอภิปรายที่มีเธรด - ความคิดเห็นฟอรัม / บล็อก
- หลายคอลัมน์เชื้อสาย
- คอลัมน์: หนึ่งรายการสำหรับแต่ละระดับเชื้อสายหมายถึงผู้ปกครองทั้งหมดถึงรากระดับลงจากระดับรายการที่ถูกตั้งค่าเป็น NULL
- บรรพบุรุษราคาถูกลูกหลานระดับ
- แทรกราคาถูกลบย้ายของใบ
- แทรกราคาแพงลบย้ายของโหนดภายใน
- ยากที่จะจำกัดความลึกของลำดับชั้น
หมายเหตุเฉพาะฐานข้อมูล
MySQL
คำพยากรณ์
- ใช้CONNECT BYเพื่อสำรวจรายการ Adjacency
PostgreSQL
- ltree ประเภทข้อมูลสำหรับเส้นทาง Materialized
เซิร์ฟเวอร์ SQL
- สรุปทั่วไป
- 2008 เสนอประเภทข้อมูลHierarchyIdเพื่อช่วยในการดำเนินการกับคอลัมน์ Lineage และขยายความลึกที่สามารถแสดงได้
Closure Tables
จะดีกว่าAdjacency List
,Path Enumeration
และNested Sets
ในแง่ของความสะดวกในการใช้งาน (และฉันคาดเดาผลการดำเนินงานเช่นกัน)