PHP-তে ডেটার আত্মীয়তার সম্পর্ক
ধরুন আমাদের সামনে বাবা এবং ছেলেদের সংরক্ষণের কাজ রয়েছে। ধরুন প্রতিটি বাবার শুধুমাত্র একটি ছেলে থাকতে পারে, আর ছেলে আবার তার একটি ছেলে থাকতে পারে।
আমাদের ভাবতে হবে কিভাবে আমরা ডেটা সংরক্ষণ করব।
প্রথম ধারণা যা মাথায় আসতে পারে
- দুটি টেবিল তৈরি করা: parents
বাবাদের জন্য এবং sons ছেলেদের জন্য। তারপর এই
টেবিলগুলিকে কোনো ফিল্ড দিয়ে সংযুক্ত করা: son_id
বা parent_id।
যাইহোক, এই ধারণাটি খুব ভাল নয় - কারণ একই ব্যক্তি একই সাথে বাবা এবং ছেলে উভয়ই হতে পারে - এবং তাকে উভয় টেবিলে সংরক্ষণ করতে হবে, আর এটি অসুবিধাজনক, বেশি জায়গা নেয় এবং সহজেই ভুলের দিকে নিয়ে যায়।
আরও ভাল বিকল্প হল টেবিলটিকে নিজের সাথে
সংযুক্ত করা: আসুন একটি users টেবিল তৈরি করি, এতে
সকল ব্যবহারকারী সংরক্ষণ করব এবং প্রত্যেকের জন্য
একটি son_id ফিল্ড তৈরি করব,
যাতে এই একই টেবিল থেকে ছেলের
id সংরক্ষিত থাকবে:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
কোয়েরি
এখন এমন একটি কোয়েরি লিখি যা ব্যবহারকারীকে তার ছেলেসহ বের করে আনবে।
প্রথমে শুধু ব্যবহারকারীদের বের করে আনি:
sqlSELECT
*
FROM
users
এখন ব্যবহারকারীদের সাথে তাদের ছেলেদের জয়েন করি। আমরা টেবিলটিকে নিজের সাথে জয়িন করব, তাই আমাদের এটির নাম পরিবর্তন করতে হবে:
sqlLEFT JOIN users as sons
এখন আমরা মূল টেবিল এবং নাম পরিবর্তন করা টেবিলের মধ্যে সম্পর্ক নির্দেশ করতে পারি:
sqlLEFT JOIN users as sons ON sons.id=users.son_id
এখন ফিল্ডগুলি নির্দেশ করি:
sqlSELECT
users.name as user_name, sons.name as son_name
এখন সব একত্রিত করি এবং নিম্নলিখিত কোয়েরি পাই:
sqlSELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
ব্যবহারিক কাজ
ধরুন আমাদের কাছে বিভাগ রয়েছে। প্রতিটি বিভাগ একটি মূল বিভাগের অন্তর্ভুক্ত হতে পারে, সেটি আবার তার নিজের মূল বিভাগের অন্তর্ভুক্ত হতে পারে এবং এভাবে চলতে থাকে। সংরক্ষণের গঠনটি লিখে দিন।
এমন একটি কোয়েরি লিখুন যা বিভাগটিকে তার মূল বিভাগসহ বের করে আনবে।
এমন একটি কোয়েরি লিখুন যা বিভাগটিকে তার মূল বিভাগ এবং মূল বিভাগের মূল বিভাগসহ বের করে আনবে।
এমন একটি কোয়েরি লিখুন যা বিভাগটিকে তার মূল বিভাগ, মূল বিভাগের মূল বিভাগ এবং মূল বিভাগের মূল বিভাগের মূল বিভাগসহ বের করে আনবে।