Schema কেন দরকার?
একটা বিশ্ববিদ্যালয়ে রাখতে হয় শিক্ষার্থী, শিক্ষক, কোর্স, বিভাগ, ফলাফল ও ফি — এই সবকিছুর তথ্য।
❓ এই সবকিছু কি একটাই টেবিলে রাখা উচিত?
না, তাহলে সব তথ্য জট পাকিয়ে যাবে।
❓ এই বিশাল তথ্য কীভাবে সাজাবো?
আলাদা আলাদা ভাগে ভাগ করে সাজাতে হবে।
❓ হাজার হাজার কর্মী কীভাবে দ্রুত সঠিক তথ্য খুঁজে পাবে?
একটা স্পষ্ট, সুসংগঠিত কাঠামো থাকলে সহজেই পাওয়া যাবে।
একটা স্কুলে যদি সব ক্লাসের সব শিক্ষার্থী একই ঘরে বসতো, পুরো ব্যবস্থা এলোমেলো হয়ে যেত। এজন্যই স্কুলে আলাদা আলাদা শ্রেণিকক্ষ থাকে — প্রতিটার নির্দিষ্ট উদ্দেশ্য ও শিক্ষার্থী। ডেটাবেজেও ঠিক এই একই কারণে তথ্যকে আলাদা আলাদা, সুশৃঙ্খল ভাগে সাজাতে হয়।
একইভাবে, একটা লাইব্রেরিতে সব বই এলোমেলোভাবে না রেখে বিষয়ভিত্তিক সেকশনে (বিজ্ঞান, ইতিহাস, উপন্যাস) সাজানো হয়। একটা শপিং মলে প্রতিটা দোকান নির্দিষ্ট ধরনের পণ্য বিক্রি করে। একটা ফাইলিং ক্যাবিনেটে প্রতিটা ফোল্ডারে লেবেল লাগানো থাকে। এই সবগুলোই "সংগঠন" (organization)-এর উদাহরণ — আর ডেটাবেজেও এই একই ধরনের সংগঠন দরকার হয়।
এলোমেলো তথ্যের স্তূপ
ভাগে ভাগে সাজানো ডেটা
এই সংগঠনের নকশা/ব্লুপ্রিন্ট
Schema কী?
প্রথমে Database কী তা মনে করি: Database হলো একটা বড় ডিজিটাল গুদাম, যেখানে সব তথ্য জমা থাকে।
একটা লাইব্রেরি (Library) হলো পুরো Database। সেই লাইব্রেরির প্রতিটা বিষয়ভিত্তিক সেকশন (বিজ্ঞান সেকশন, ইতিহাস সেকশন) হলো Schema — যা বলে দেয় কোন ধরনের বই কোথায় থাকবে। আর প্রতিটা সেকশনের ভেতরের বইগুলো হলো Tables, যেখানে প্রকৃত তথ্য থাকে।
(Database)
(Schema)
(Tables)
সংজ্ঞা: Schema হলো একটা ডেটাবেজের যৌক্তিক গঠন বা নীল-নকশা (blueprint), যা নির্ধারণ করে ডেটা কীভাবে সংগঠিত থাকবে — কোন টেবিল থাকবে, প্রতিটা টেবিলে কী ধরনের তথ্য থাকবে, এবং টেবিলগুলো একে অপরের সাথে কীভাবে সম্পর্কিত।
একটা বাড়ি তৈরির আগে একজন স্থপতি একটা নকশা (blueprint) আঁকেন — কোথায় কয়টা ঘর, কোথায় রান্নাঘর, কোথায় বাথরুম। Schema অনেকটা সেই নকশার মতো — এটা বাস্তব তথ্য (আসবাবপত্র) নয়, বরং তথ্য কোথায় ও কীভাবে থাকবে তার পরিকল্পনা।
Schema-এর উপাদান
🗄️ Database
সংজ্ঞা: সব তথ্যের বড় ডিজিটাল গুদাম।
"UniversityDB" — যেখানে বিশ্ববিদ্যালয়ের সব তথ্য থাকে।
🗂️ Schema
সংজ্ঞা: ডেটাবেজের ভেতরের সংগঠনের নকশা — কোন টেবিল কীভাবে সাজানো থাকবে তার পরিকল্পনা।
"academic" নামের একটা schema, যার ভেতরে Students, Teachers, Courses টেবিল থাকতে পারে।
📋 Table (টেবিল)
সংজ্ঞা: একই ধরনের তথ্য সারি-কলাম আকারে রাখার জায়গা।
Students টেবিল, যেখানে সব শিক্ষার্থীর তথ্য থাকে।
📊 Column (কলাম)
সংজ্ঞা: একটা টেবিলের প্রতিটা "বৈশিষ্ট্য" বা তথ্যের ধরন।
Students টেবিলে name, class, phone প্রতিটাই একেকটা কলাম।
📄 Row (সারি)
সংজ্ঞা: একটা নির্দিষ্ট রেকর্ড বা একজন ব্যক্তির সম্পূর্ণ তথ্য।
"রিমা, ৮ম শ্রেণি, ফোন নম্বর ..." — এটা একটা সারি, একজন নির্দিষ্ট শিক্ষার্থীর তথ্য।
🔤 Data Type (ডেটা টাইপ)
সংজ্ঞা: একটা কলামে কী ধরনের মান (সংখ্যা, লেখা, তারিখ) থাকবে তা নির্ধারণ করে।
| Data Type | কী রাখে | উদাহরণ |
|---|---|---|
| INT | পূর্ণসংখ্যা | বয়স, ক্লাস |
| VARCHAR(n) | লেখা (সর্বোচ্চ n অক্ষর) | নাম, ঠিকানা |
| DATE | তারিখ | জন্ম তারিখ |
| DECIMAL | দশমিক সংখ্যা | ফি, বেতন |
🔒 Constraint (নিয়ন্ত্রণ শর্ত)
সংজ্ঞা: একটা কলামে কী ধরনের মান গ্রহণযোগ্য তার নিয়ম।
NOT NULL মানে এই কলাম কখনো ফাঁকা রাখা যাবে না — যেমন প্রতিটা শিক্ষার্থীর অবশ্যই একটা নাম থাকতে হবে।
🔑 Primary Key (প্রাইমারি কী)
সংজ্ঞা: এমন একটা কলাম যার মান প্রতিটা রেকর্ডে সম্পূর্ণ আলাদা (unique) — যা দিয়ে একটা নির্দিষ্ট রেকর্ড শনাক্ত করা যায়।
প্রতিটা শিক্ষার্থীর জাতীয় পরিচয়পত্র নম্বরের মতো — কারো সাথে কারো মিলবে না।
🔗 Foreign Key (ফরেন কী)
সংজ্ঞা: একটা টেবিলের কলাম, যা অন্য একটা টেবিলের Primary Key-কে নির্দেশ করে — এভাবে দুইটা টেবিল একে অপরের সাথে যুক্ত হয়।
একটা রেফারেন্স চিঠির মতো — "এই শিক্ষার্থীটা কোন বিভাগের, তা জানতে Departments টেবিলের এই নম্বরটা দেখো।"
🔀 Relationship (সম্পর্ক)
সংজ্ঞা: Primary Key ও Foreign Key ব্যবহার করে দুইটা টেবিলের মধ্যে তৈরি হওয়া যোগাযোগ।
একজন শিক্ষক একাধিক শিক্ষার্থীকে পড়ান — Teachers ও Students টেবিলের মধ্যে এটা একটা সম্পর্ক।
একটা Schema ডিজাইন করা
একটা স্কুল একটা Student Management System বানাতে চায়। আমরা তাদের জন্য একটা schema ডিজাইন করবো।
কোন কোন টেবিল দরকার ও কেন
| টেবিল | কেন দরকার | মূল ফিল্ড |
|---|---|---|
| Students | শিক্ষার্থীর ব্যক্তিগত তথ্য রাখতে | student_id (PK), name, class |
| Teachers | শিক্ষকের তথ্য রাখতে | teacher_id (PK), name, subject |
| Courses | কোর্সের তথ্য রাখতে | course_id (PK), course_name, teacher_id (FK) |
| Departments | বিভাগের তথ্য রাখতে | department_id (PK), department_name |
| Enrollments | কোন শিক্ষার্থী কোন কোর্সে ভর্তি তা রাখতে | enrollment_id (PK), student_id (FK), course_id (FK) |
| Results | ফলাফল রাখতে | result_id (PK), student_id (FK), course_id (FK), marks |
ধারণাগত ER ডায়াগ্রাম
লক্ষ্য করো, Enrollments টেবিলটা Students ও Courses-এর মাঝখানে "সেতু" হিসেবে কাজ করছে — কারণ একজন শিক্ষার্থী একাধিক কোর্সে, এবং একটা কোর্সে একাধিক শিক্ষার্থী থাকতে পারে।
Primary Key নিশ্চিত করে প্রতিটা রেকর্ড অনন্যভাবে শনাক্ত করা যায়। Foreign Key নিশ্চিত করে টেবিলগুলোর মধ্যে তথ্য সঠিকভাবে সংযুক্ত থাকে — যেমন একটা Enrollment রেকর্ড কোনো অস্তিত্বহীন শিক্ষার্থীর সাথে যুক্ত হতে পারবে না।
SQL-এ Schema তৈরি করা
ধাপ ১: Database তৈরি করা
SQL কোডব্যাখ্যা: এটা "UniversityDB" নামে একটা নতুন, খালি ডেটাবেজ তৈরি করলো।
ধাপ ২: Database ব্যবহার করা
SQL কোডব্যাখ্যা: এখন থেকে পরবর্তী সব কমান্ড এই "UniversityDB"-এর ভেতরেই কাজ করবে।
ধাপ ৩: একাধিক টেবিল তৈরি করা
SQL কোডলাইন-বাই-লাইন ব্যাখ্যা:
CREATE TABLE Departments (...)— Departments নামের একটা টেবিল তৈরি হলোdepartment_id INT PRIMARY KEY— এই কলাম প্রতিটা বিভাগের জন্য অনন্য পরিচয়Studentsটেবিলেdepartment_idকলাম আছে, যাFOREIGN KEYহিসেবে Departments টেবিলের সাথে সংযুক্ত হলো
নামকরণের নিয়ম (Naming Conventions)
| ভালো নাম | খারাপ নাম | কেন |
|---|---|---|
| student_name | sn / col1 | স্পষ্ট ও বোঝার মতো |
| Students (বহুবচন টেবিল নাম) | student_info_final_v2 | সহজ ও সামঞ্জস্যপূর্ণ |
| department_id | deptID123 | ধারাবাহিক ও পঠনযোগ্য |
- Foreign Key যোগ করার আগে যে টেবিলটাকে রেফারেন্স করা হচ্ছে সেটা তৈরি না করা (ভুল ক্রমে টেবিল তৈরি করা)
- PRIMARY KEY দিতে ভুলে যাওয়া, যার ফলে ডুপ্লিকেট রেকর্ড তৈরি হতে পারে
- ডেটা টাইপ ভুল বেছে নেওয়া (যেমন ফোন নম্বরের জন্য INT ব্যবহার করা, যেখানে শুরুতে ০ থাকলে তা হারিয়ে যেতে পারে)
সবসময় প্রথমে "মূল" টেবিলগুলো (যেমন Departments) তৈরি করো, তারপর যেসব টেবিল সেগুলোকে রেফারেন্স করে (যেমন Students) সেগুলো তৈরি করো।
Schema-এর ভেতরের সম্পর্কের ধরন
1️⃣ One-to-One (এক-থেকে-এক)
একটা রেকর্ড ঠিক আরেকটা রেকর্ডের সাথেই যুক্ত।
একজন শিক্ষার্থীর ঠিক একটাই আইডি কার্ড থাকে, একটা আইডি কার্ড ঠিক একজন শিক্ষার্থীরই।
2️⃣ One-to-Many (এক-থেকে-বহু)
একটা রেকর্ড একাধিক রেকর্ডের সাথে যুক্ত হতে পারে।
একজন শিক্ষক একাধিক শিক্ষার্থীকে পড়ান, কিন্তু একজন শিক্ষার্থীর (এই উদাহরণে) নির্দিষ্ট ক্লাস টিচার একজনই।
3️⃣ Many-to-Many (বহু-থেকে-বহু)
দুইদিকের রেকর্ডই একাধিকভাবে একে অপরের সাথে যুক্ত হতে পারে — এক্ষেত্রে মাঝে একটা "সংযোগকারী" টেবিল লাগে।
একজন শিক্ষার্থী একাধিক কোর্সে ভর্তি হতে পারে, আর একটা কোর্সে একাধিক শিক্ষার্থী থাকতে পারে — তাই মাঝে Enrollments টেবিল লাগে।
| সম্পর্কের ধরন | সহজ উদাহরণ | মাঝে বাড়তি টেবিল লাগে? |
|---|---|---|
| One-to-One | শিক্ষার্থী ↔ আইডি কার্ড | না |
| One-to-Many | শিক্ষক → শিক্ষার্থীরা | না |
| Many-to-Many | শিক্ষার্থীরা ↔ কোর্সসমূহ | হ্যাঁ (Enrollments-এর মতো) |
ভালো Schema বনাম খারাপ Schema
| বিষয় | ভালো Schema | খারাপভাবে ডিজাইন করা Schema |
|---|---|---|
| সংগঠন | প্রতিটা তথ্য যৌক্তিক টেবিলে ভাগ করা | সব তথ্য একটা মাত্র বিশাল টেবিলে গাদাগাদি |
| ডেটা পুনরাবৃত্তি | একই তথ্য বার বার লেখা লাগে না | একই তথ্য বার বার কপি হয়ে থাকে |
| পারফরম্যান্স | দ্রুত খোঁজা ও আপডেট করা যায় | ধীরগতির, বড় টেবিলে খোঁজা কঠিন |
| রক্ষণাবেক্ষণ | পরিবর্তন করা সহজ | একটা পরিবর্তনে অনেক জায়গায় ভুল হওয়ার ঝুঁকি |
| স্কেলেবিলিটি | নতুন তথ্য বা টেবিল যোগ করা সহজ | নতুন কিছু যোগ করতে গেলে পুরো কাঠামো ভেঙে যেতে পারে |
| পঠনযোগ্যতা | নাম ও কাঠামো দেখেই বোঝা যায় | বোঝা কঠিন, অস্পষ্ট নামকরণ |
যদি একটা স্কুল Students টেবিলেই শিক্ষকের নাম, বিভাগের নাম, কোর্সের নাম সবকিছু বার বার লিখে রাখে (প্রতিটা শিক্ষার্থীর সারিতে), তাহলে কোনো শিক্ষকের নাম পরিবর্তন হলে শত শত সারি খুঁজে খুঁজে পরিবর্তন করতে হবে — এটাই একটা খারাপ Schema-এর ক্লাসিক উদাহরণ।
বাস্তব শিল্প-প্রয়োগ
| কোম্পানি/খাত | Schema-তে কী কী টেবিল থাকতে পারে |
|---|---|
| ব্যাংকিং সিস্টেম | Customers, Accounts, Transactions, Loans |
| হাসপাতাল ম্যানেজমেন্ট | Patients, Doctors, Appointments, Prescriptions |
| ই-কমার্স | Customers, Products, Orders, Payments |
| Users, Posts, Comments, Friendships | |
| YouTube | Users, Videos, Comments, Subscriptions |
| Netflix | Users, Movies, WatchHistory, Subscriptions |
| Uber | Riders, Drivers, Trips, Payments |
প্রতিটা ক্ষেত্রেই মূল ধরনটা একই — সম্পর্কিত তথ্যগুলোকে আলাদা আলাদা টেবিলে ভাগ করে, Primary/Foreign Key দিয়ে সংযুক্ত করা হয়েছে।
MySQL Workbench প্র্যাকটিক্যাল সেশন
চলো সম্পূর্ণ একটা mini Schema বাস্তবে তৈরি করে দেখি।
ধাপ ১: Database তৈরি ও ব্যবহার
SQL কোডধাপ ২: একাধিক টেবিল তৈরি ও সংযুক্ত করা
SQL কোডধাপ ৩: Schema-এর গঠন দেখা
SQL কোড| Field | Type | Null | Key |
|---|---|---|---|
| student_id | int | NO | PRI |
| name | varchar(50) | YES | |
| teacher_id | int | YES | MUL |
ব্যাখ্যা: DESCRIBE কমান্ড একটা টেবিলের সম্পূর্ণ কাঠামো (কলাম, ডেটা টাইপ, Key তথ্য) দেখায়।
ধাপ ৪: নমুনা ডেটা যোগ করা
SQL কোডধাপ ৫: সম্পর্ক যাচাই করা (JOIN দিয়ে একসাথে দেখা)
SQL কোড| student_name | teacher_name |
|---|---|
| নাবিলা | রফিক স্যার |
ব্যাখ্যা: JOIN দুইটা টেবিলকে তাদের Primary/Foreign Key সম্পর্কের ভিত্তিতে একসাথে জোড়া লাগিয়ে দেখায় — এটা আমরা পরের ক্লাসে বিস্তারিত শিখবো, আজ শুধু বুঝলাম Schema-এর সম্পর্কগুলো বাস্তবে এভাবে কাজে লাগে।
- Foreign Key-এর ডেটা টাইপ মূল Primary Key-এর সাথে না মেলা (যেমন একটাতে INT, আরেকটাতে VARCHAR)
- প্রথমে child টেবিল (যেমন Students) তৈরি করে ফেলা, যেখানে এখনো parent টেবিল (Teachers) তৈরিই হয়নি
সাধারণ শুরুর ভুল
✅ সমাধান: Database হলো পুরো গুদাম, Schema হলো তার ভেতরের সংগঠন-পরিকল্পনা।
✅ সমাধান: সম্পর্কিত তথ্যগুলোকে যৌক্তিকভাবে আলাদা টেবিলে ভাগ করো।
✅ সমাধান: প্রতিটা টেবিলেই একটা Primary Key রাখা অভ্যাস করো।
✅ সমাধান: সম্পর্কিত টেবিলগুলোর মধ্যে Foreign Key দিয়ে সংযোগ নিশ্চিত করো।
✅ সমাধান: স্পষ্ট, অর্থবহ ও সামঞ্জস্যপূর্ণ নাম ব্যবহার করো।
✅ সমাধান: একই তথ্য একাধিক টেবিলে বার বার না রেখে Foreign Key দিয়ে রেফার করো।
✅ সমাধান: ফোন নম্বরের জন্য VARCHAR, বয়সের জন্য INT, ফির জন্য DECIMAL ব্যবহার করো।
✅ সমাধান: শুরুতেই ভাবো কোন টেবিল কোন টেবিলের সাথে কীভাবে সংযুক্ত হবে।
ইন্ডাস্ট্রি বেস্ট প্র্যাকটিস
🏷️ নামকরণের নিয়ম
টেবিল ও কলামের নাম স্পষ্ট, ছোট ও অর্থবহ রাখা
🧩 সামঞ্জস্যপূর্ণ ডিজাইন
সব টেবিলে একই ধাঁচের নামকরণ ও কাঠামো অনুসরণ করা
🔁 ডুপ্লিকেট ডেটা এড়ানো
Normalization নামের কৌশল ব্যবহার করে একই তথ্য বার বার না রাখা
📝 ডকুমেন্টেশন
প্রতিটা টেবিল ও কলামের উদ্দেশ্য লিখে রাখা, যাতে অন্যরাও বুঝতে পারে
📈 স্কেলেবিলিটি
ভবিষ্যতে নতুন তথ্য বা টেবিল সহজে যোগ করার মতো নমনীয় ডিজাইন রাখা
🔐 নিরাপত্তা
সংবেদনশীল তথ্যে (যেমন পাসওয়ার্ড) সীমিত অ্যাক্সেস নিশ্চিত করা
যেমন প্রোগ্রামাররা কোডের পরিবর্তনের ইতিহাস রাখেন (Git দিয়ে), তেমনি ডেটাবেজ পরিবর্তনগুলোরও (যেমন নতুন কলাম যোগ করা) রেকর্ড রাখা হয়, যাতে প্রয়োজনে আগের অবস্থায় ফেরা যায়। একে বলে Database Migration ট্র্যাকিং।
ক্লাসরুম অ্যাক্টিভিটি
রিভিশন ও প্রশ্নোত্তর
📌 দ্রুত রিভিশন নোট
- Schema = ডেটাবেজের যৌক্তিক সংগঠন-পরিকল্পনা (blueprint)
- Database ⊃ Schema ⊃ Tables ⊃ Columns/Rows
- Primary Key = অনন্য শনাক্তকারী, Foreign Key = অন্য টেবিলের সাথে সংযোগ
- সম্পর্কের ধরন: One-to-One, One-to-Many, Many-to-Many
- ভালো Schema = কম ডুপ্লিকেশন, দ্রুত পারফরম্যান্স, সহজ রক্ষণাবেক্ষণ
🏛️ সম্পূর্ণ ডেটাবেজ আর্কিটেকচার ডায়াগ্রাম
🕰️ Database Schema-এর সংক্ষিপ্ত ইতিহাস
একসময় তথ্য রাখা হতো শুধু সাধারণ ফাইলে (Flat File) — যেমন একটা টেক্সট ফাইলে সব তথ্য গাদাগাদি করে। এতে ডুপ্লিকেশন ও ভুলের ঝুঁকি অনেক বেশি ছিলো। ১৯৭০-এর দশকে Relational Database (টেবিল-ভিত্তিক, সম্পর্কযুক্ত) ধারণা আসে, যা থেকে জন্ম নেয় আধুনিক Schema পদ্ধতি। বর্তমানে ক্লাউড ডেটাবেজ (যেমন Amazon RDS, Google Cloud SQL) দিয়ে বিশাল স্কেলে, দূর থেকেও নমনীয়ভাবে Schema পরিচালনা করা যায়।
🏥 এন্ড-টু-এন্ড মিনি প্রজেক্ট: হাসপাতাল ম্যানেজমেন্ট Schema
| টেবিল | মূল ফিল্ড |
|---|---|
| Patients | patient_id (PK), name, age, phone |
| Doctors | doctor_id (PK), name, specialty |
| Appointments | appointment_id (PK), patient_id (FK), doctor_id (FK), date |
| Prescriptions | prescription_id (PK), appointment_id (FK), medicine_name |
লক্ষ্য করো, Appointments টেবিলটা Patients ও Doctors-এর মধ্যে সেতু হিসেবে কাজ করছে — ঠিক আমাদের আগের Enrollments উদাহরণের মতোই।
👥 প্রফেশনাল ওয়ার্কফ্লো
Schema-এর নিরাপত্তা ও পারফরম্যান্স দেখাশোনা
Schema ডিজাইন ও পাইপলাইন তৈরি
Schema থেকে ডেটা এক্সট্র্যাক্ট করে বিশ্লেষণ
একটা কোম্পানিতে সাধারণত DBA (Database Administrator) ও Data Engineer একসাথে Schema ডিজাইন করেন, নিশ্চিত করেন এটা নিরাপদ ও দ্রুত কাজ করে, আর Data Scientist সেই Schema থেকে ডেটা নিয়ে বিশ্লেষণ ও মডেলিং করেন।
❓ ভাইভা প্রশ্ন
💼 ইন্টারভিউ প্রস্তুতি — টপ ৩০টি বিগিনার লেভেল প্রশ্ন
✅ MCQ প্র্যাকটিস
(ক) একটা রেকর্ড (খ) ডেটাবেজের সংগঠন-পরিকল্পনা (গ) একটা কলাম (ঘ) একটা SQL কমান্ড
(ক) Foreign Key (খ) Column (গ) Primary Key (ঘ) Row
(ক) One-to-One (খ) One-to-Many (গ) Many-to-Many (ঘ) কোনোটাই না
(ক) কিছুই না (খ) শুধু Primary Key (গ) একটা junction টেবিল (ঘ) DROP কমান্ড
(ক) সব তথ্য একটা টেবিলে (খ) ডুপ্লিকেট ডেটা বেশি (গ) সঠিকভাবে ভাগ করা টেবিল (ঘ) কোনো Key ছাড়া টেবিল
📝 হোমওয়ার্ক অ্যাসাইনমেন্ট
- একটা "E-commerce" সিস্টেমের জন্য Schema ডিজাইন করো — কমপক্ষে ৪টা টেবিল (Customers, Products, Orders, Payments) ও তাদের ফিল্ড, Primary Key ও Foreign Key উল্লেখ করে।
- Database Architecture ডায়াগ্রাম (User → Application → Database → Schema → Tables → Rows) নিজ হাতে এঁকে আনো।
- One-to-One, One-to-Many ও Many-to-Many সম্পর্কের একটা করে নিজের তৈরি বাস্তব উদাহরণ লেখো (আজকের ক্লাসের উদাহরণ ছাড়া অন্য কিছু)।