পাইথনে ডেটার আত্মীয়তার সম্পর্ক
ধরুন আমাদের সামনে বাবা এবং ছেলেদের সংরক্ষণের কাজ রয়েছে। ধরুন প্রতিটি বাবার শুধুমাত্র একটি ছেলে থাকতে পারে, এবং ছেলে আবার এরও একটি ছেলে থাকতে পারে।
আমরা কীভাবে ডেটা সংরক্ষণ করব
তা ভাবতে হবে। প্রথম ধারণা যা মাথায় আসতে পারে
তা হলো দুটি টেবিল তৈরি করা: 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 করি। আমরা টেবিলটিকে নিজের সাথে 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
ব্যবহারিক সমস্যা
ধরুন আমাদের কাছে বিভাগ রয়েছে। প্রতিটি বিভাগ একটি মূল বিভাগের অন্তর্ভুক্ত হতে পারে, সেটি আবার তার মূল বিভাগের অন্তর্ভুক্ত হতে পারে এবং এভাবে চলতে থাকে। সংরক্ষণের গঠনটি লিখে দিন।
একটি কোয়েরি লিখুন যা বিভাগটিকে এর মূল বিভাগসহ বের করবে।
একটি কোয়েরি লিখুন যা বিভাগটিকে এর মূল এবং মূলের মূল বিভাগসহ বের করবে।
একটি কোয়েরি লিখুন যা বিভাগটিকে এর মূল, মূলের মূল এবং মূলের মূলের মূল বিভাগসহ বের করবে।