মূল বিষয়বস্তু
কম্পিউটার প্রোগ্রামিং
Course: কম্পিউটার প্রোগ্রামিং > Unit 3
Lesson 3: এসকিউএল এ রিলেশনাল কুয়েরি- সংশ্লিষ্ট টেবিলের মধ্যে ডাটা বিভাজন
- সম্পর্কযুক্ত টেবিল JOIN করা
- চ্যালেঞ্জ: ববির-শখ
- সম্পর্কযুক্ত টেবিল left outer join দিয়ে একসাথে করা
- চ্যালেঞ্জ: গ্রাহকের অর্ডার
- টেবিলগুলোকে self-join দিয়ে নিজেদের ভেতর একসাথে করা
- চ্যালেঞ্জ: SQL এ সিকোয়েল (Sequel)
- একাধিক join সমন্বয় করা
- চ্যালেঞ্জ: বন্ধুত্বের বই
- প্রকল্প: বিখ্যাতরা
- আরো দক্ষ SQL কুয়েরি পরিকল্পনা এবং অপ্টিমাইজেশান করা
© 2023 Khan Academyব্যবহারের শর্তাদিগোপনীয়তার নীতিমালাকুকি নোটিশ
সংশ্লিষ্ট টেবিলের মধ্যে ডাটা বিভাজন
এতক্ষণ পর্যন্ত আমরা শুধু, একটি টেবিল (table) নিয়ে কাজ করছিলাম এবং সেই টেবিল থেকে ডাটা (data - উপাত্ত) নেওয়ার বিভিন্ন উপায় দেখছিলাম। কিন্তু আসলে, প্রায় সময়ই, ডাটা একাধিক টেবিলে বন্টিত থাকে এবং সে সকল টেবিল পরস্পরের সাথে কোন না কোনভাবে "সম্পর্কযুক্ত" থাকতে পারে।
উদাহরণস্বরূপ, ধরি, একটি টেবিলে শিক্ষার্থীদের পরীক্ষার ফলাফল এবং তাদের ই-মেইলও সংরক্ষণ করা হয়:
student_name | student_email | test | grade |
---|---|---|---|
Peter Rabbit | peter@rabbit.com | Nutrition | 95 |
Alice Wonderland | alice@wonderland.com | Nutrition | 92 |
Peter Rabbit | peter@rabbit.com | Chemistry | 8 5 |
Alice Wonderland | alice@wonderland.com | Chemistry | 95 |
প্রত্যেক শিক্ষার্থী কোন কোন বই (book) পড়ে, সেটা সংরক্ষণের জন্য আরেকটি টেবিল তৈরি করি:
student_name | book_title | book_author |
---|---|---|
Peter Rabbit | The Tale of Mrs. Tiggy-Winkle | Beatrix Potter |
Peter Rabbit | Jabberwocky | Lewis Carroll |
Alice Wonderland | The Hunting of the Snark | Lewis Carroll |
Alice Wonderland | Jabberwocky | Lewis Carroll |
প্রত্যেক শিক্ষার্থীর তথ্য সংরক্ষণের জন্য আরেকটি টেবিল তৈরি করি:
id | student_first | student_last | student_email | phone | birthday |
---|---|---|---|---|---|
1 | পিটার | খরগোশ | peter@rabbit.com | 555-6666 | 2001-05-10 |
2 | এলিস | Wonderland | alice@wonderland.com | 555-4444 | 2001-04-02 |
এই টেবিলগুলো কি ঠিক আছে? এগুলোকে কি একটু পরিবর্তন করা দরকার?
এই টেবিলগুলো থেকে একটি বিষয় শেখা যায়: তারা Relational data অর্থাৎ সম্পর্কযুক্ত ডাটা প্রকাশ করে - মানে, তারা এমন ডাটা সংরক্ষণ করে যারা পরস্পর সম্পর্কযুক্ত। প্রত্যেকটি টেবিল নির্দিষ্ট শিক্ষার্থীর জন্য ডাটা আছে এবং অনেক টেবিলে একই ডাটা রয়েছে। যখন ডাটা একাধিক টেবিলে থাকে, তখন একটি টেবিল পরিবর্তনের ফলাফল অন্য টেবিলকে প্রভাবিত করে।
উদাহরণস্বরূপ, যদি একজন শিক্ষার্থীর ই-মেইল পরিবর্তন করতে হয়? কোন টেবিলে সেটা পরিবর্তন করতে হবে?
শিক্ষার্থীর ডাটার টেবিলটি পরিবর্তন করতে হবে, কিন্তু শিক্ষার্থীর ফলাফলের টেবিলেও একই ডাটা আছে, এছাড়াও শিক্ষার্থীর প্রতিটি সারি যাচাই করে ই-মেইল পরিবর্তন করতে হবে।
বিভিন্ন ডাটা যেন বিভিন্ন স্থানে না থাকে এবং কমসংখ্যক আপডেট (Update) করার জন্য খেয়াল রাখতে হবে যেন, একটি নির্দিষ্ট কলামের ডাটা একটি স্থানে সংরক্ষিত থাকে। যদি এটা করা হয়, তাহলে এই ডাটাকে অন্যান্য টেবিলের সাথে সম্পর্কযুক্ত করতে হবে, এটা আমরা পরে করবো।
ধরি, শিক্ষার্থীর ফলাফলের টেবিল থেকে ই-মেইল মুছে দেবো, কারণ একই উপাত্ত শিক্ষার্থীর টেবিলেও আছে। তাহলে টেবিলটি এমন হবে:
student_name | test | grade |
---|---|---|
Peter Rabbit | Nutrition | 95 |
Alice Wonderland | Nutrition | 92 |
Peter Rabbit | Chemistry | 8 5 |
Alice Wonderland | Chemistry | 95 |
এখন, প্রত্যেক শিক্ষার্থীর ই-মেইল কীভাবে বের করবো? নামের মিল দেখে, শিক্ষার্থীর তথ্যের টেবিল থেকে এটা পাওয়া যাবে। কিন্তু একই নামে 2 জন শিক্ষার্থীর ক্ষেত্রে কি হবে? (একটি মজার তথ্য, বালিতে (Bali), প্রতি 4 জনের মধ্যে 1 জনের প্রথম নাম একই।) শিক্ষার্থী খুঁজে বের করার জন্য নামের উপর নির্ভর করলে চলবে না এবং সত্যিই, টেবিলে কোনকিছু বের করতে হলে নামের উপর নির্ভর করা মোটেও উচিত নয়।
তাই সবচেয়ে উত্তম উপায় হল
student_name
মুছে ফেলে এটার পরিবর্তে student_id
ব্যবহার করা, কারণ এটা একটি অদ্বিতীয় সংখ্যা:student_id | test | grade |
---|---|---|
1 | Nutrition | 95 |
2 | Nutrition | 92 |
1 | Chemistry | 8 5 |
2 | Chemistry | 95 |
We would make the same change to our books table, using
student_id
instead of student_name
:student_id | book_title | book_author |
---|---|---|
1 | The Tale of Mrs. Tiggy-Winkle | Beatrix Potter |
1 | Jabberwocky | Lewis Carroll |
2 | The Hunting of the Snark | Lewis Carroll |
2 | Jabberwocky | Lewis Carroll |
লক্ষ্য করি, Jabberwocky এর ক্ষেত্রে title (শিরোনাম) এবং author (লেখক) দুইবার আছে? এটার সমাধান হল একটি টেবিলকে ভেঙে একাধিক সম্পর্কযুক্ত টেবিলে পরিণত করা, যেন কোনকিছু পরিবর্তন করার সময় একাধিক স্থানে আপডেট (update) না করতে হয়।
শুধু বইয়ের জন্য একটি টেবিল তৈরি করি:
id | book_title | book_author |
---|---|---|
1 | The Tale of Mrs. Tiggy-Winkle | Beatrix Potter |
2 | Jabberwocky | Lewis Carroll |
3 | The Hunting of the Snark | Lewis Carroll |
তাহলে
student_books
টেবিলটি এমন হবে:student_id | book_id |
---|---|
1 | 1 |
1 | 2 |
2 | 3 |
2 | 2 |
I know, this table doesn't look nearly as readable as the old table that had all of information stuffed into every row. But, tables are often not designed to be readable to humans-- they're designed to be the easiest to maintain and least prone to bugs. In many cases, it may be best to split information into multiple related tables, so that there is less redundant data and fewer places to update.
একাধিক টেবিলের সম্পর্কযুক্ত উপাত্ত নিয়ে SQL দিয়ে কাজ করা একটি গুরুত্বপূর্ণ বিষয়। ডাটা নিয়ে এ সকল কাজ আমরা "join" (সংযোগ) নামক একটি প্রক্রিয়া ব্যবহার করে করব এবং এটিই হল পরবর্তী বিষয়।
আলোচনায় অংশ নিতে চাও?
কোন আলাপচারিতা নেই।