ความสัมพันธ์เชิงลำดับชั้นของข้อมูลใน Python
สมมติว่าเรามีภารกิจในการเก็บข้อมูลพ่อ และลูกชาย ให้พ่อแต่ละคนมีลูกชายได้เพียงคนเดียว และลูกชายก็สามารถมีลูกชายได้เพียงคนเดียวเช่นกัน
เราต้องคิดหาวิธีเก็บข้อมูล
ไอเดียแรกที่อาจนึกถึงคือการสร้างตารางสองตาราง: parents
สำหรับพ่อและ sons สำหรับลูกชาย จากนั้น
เชื่อมโยงตารางเหล่านี้ด้วยฟิลด์บางอย่าง:
son_id หรือ parent_id
อย่างไรก็ตาม นี่ไม่ใช่ไอเดียที่ดีนัก เพราะ คนคนเดียวกันสามารถเป็นได้ทั้งพ่อและลูกชาย ซึ่งจะทำให้ต้องเก็บข้อมูลของเขา ในทั้งสองตาราง สิ่งนี้ไม่สะดวก ใช้พื้นที่ มากขึ้น และนำไปสู่ข้อผิดพลาดได้ง่าย
ตัวเลือกที่ดีกว่าคือการเชื่อมโยงตาราง
กับตัวเอง: สร้างตาราง users
เราจะเก็บข้อมูลผู้ใช้ทั้งหมดในตารางนี้ และให้แต่ละคน
มีฟิลด์ son_id ซึ่งจะเก็บ
id ของลูกชายจากตารางเดียวกันนี้:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
การสอบถามข้อมูล
ตอนนี้มาเขียนคำสั่งสอบถามที่ ดึงข้อมูลผู้ใช้พร้อมกับลูกชายของเขากัน
เริ่มต้นด้วยการดึงข้อมูลผู้ใช้ก่อน:
SELECT
*
FROM
users
ตอนนี้มาเชื่อมตาราง (join) ผู้ใช้กับลูกชายของพวกเขา เนื่องจากเราจะเชื่อมตารางกับตัวเอง เราจึงจำเป็นต้องตั้งชื่อใหม่ให้ตาราง:
LEFT JOIN users as sons
ตอนนี้เราสามารถระบุความสัมพันธ์ระหว่างตารางหลัก และตารางที่ตั้งชื่อใหม่ได้:
LEFT JOIN users as sons ON sons.id=users.son_id
มาตอนนี้ให้ระบุฟิลด์:
SELECT
users.name as user_name, sons.name as son_name
นำทั้งหมดมารวมกัน เราจะได้คำสั่งสอบถาม ดังต่อไปนี้:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
โจทย์ฝึกปฏิบัติ
สมมติเรามีหมวดหมู่ แต่ละหมวดหมู่ สามารถอยู่ภายใต้หมวดหมู่แม่ได้ และหมวดหมู่แม่ก็สามารถอยู่ภายใต้หมวดหมู่แม่ของมันได้อีก ลำดับแบบนี้ไปเรื่อยๆ จงอธิบายโครงสร้างการเก็บข้อมูล
เขียนคำสั่งสอบถามที่ดึงข้อมูลหมวดหมู่ พร้อมกับหมวดหมู่แม่ของมัน
เขียนคำสั่งสอบถามที่ดึงข้อมูลหมวดหมู่ พร้อมกับแม่และยาย (ผู้ปกครองสองระดับ) ของมัน
เขียนคำสั่งสอบถามที่ดึงข้อมูลหมวดหมู่ พร้อมกับแม่ ยาย และทวด (ผู้ปกครองสามระดับ) ของมัน