Normalization
32. What is Database Normalization?
Normalization হলো একটি ডাটাবেস ডিজাইন টেকনিক যা একটি বড় টেবিলকে ছোট ছোট টেবিলে বিভক্ত করে এবং তাদের মধ্যে লজিক্যাল রিলেশন তৈরি করে। এর মূল লক্ষ্য হলো ডাটাবেস থেকে অপ্রয়োজনীয় বা duplicate ডেটা (Redundancy) দূর করা এবং ডেটার Integrity নিশ্চিত করা।
Why is it needed?
একটি Unnormalized ডাটাবেস মেইনটেইন করা অত্যন্ত কঠিন। Normalization নিচের কারণগুলোর জন্য প্রয়োজন:
- Storage Efficiency: একই তথ্য বারবার সেভ করতে হয় না বলে মেমোরি বা স্টোরেজ কম লাগে।
- Data Consistency: যখন কোনো তথ্য update করা হয়, তখন সেটি যেন সব জায়গায় সঠিকভাবে প্রতিফলিত হয় তা নিশ্চিত করার জন্য এটি প্রয়োজন।
- Better Organization: টেবিলগুলো ছোট এবং নির্দিষ্ট বিষয়ভিত্তিক হওয়ায় ডেটা খুঁজে পাওয়া এবং ম্যানেজ করা সহজ হয়।
- Scalability: ডাটাবেস বড় হওয়ার সাথে সাথে নতুন ডেটা যোগ করা সহজ হয় কোনো ঝামেলা ছাড়াই।
What problems does it solve?
Normalization প্রধানত তিনটি বড় সমস্যার সমাধান করে, যাদের একত্রে Modification Anomalies বলা হয়:
১. Insertion Anomaly
যদি একটি টেবিলে স্টুডেন্ট এবং তাদের কোর্সের তথ্য একসাথে থাকে, তবে কোনো নতুন কোর্স চালু হলে সেখানে কোনো স্টুডেন্ট ভর্তি না হওয়া পর্যন্ত আপনি কোর্সটি ডাটাবেসে এন্ট্রি দিতে পারবেন ন া। Normalization কোর্স এবং স্টুডেন্ট টেবিল আলাদা করে এই সমস্যার সমাধান করে।
২. Update Anomaly
ধরুন, একজন কাস্টমারের ঠিকানা ডাটাবেসের ১০টি জায়গায় আছে। যদি সে তার ঠিকানা পরিবর্তন করে এবং আপনি কেবল ৫টি জায়গায় update করেন, তবে ডেটা ইনকনসিস্টেন্ট হয়ে যাবে। নরমালাইজড টেবিলে ঠিকানা কেবল এক জায়গাতেই থাকে, তাই একবার update করলেই সব জায়গায় সঠিক তথ্য পাওয়া যায়।
৩. Deletion Anomaly
যদি আপনি কোনো স্টুডেন্টের তথ্য ডিলিট করতে গিয়ে দেখেন যে ওই রো-তে থাকা কোর্সের তথ্যও ডিলিট হয়ে গেছে (কারণ তারা একই টেবিলে ছিল), তবে সেটা ডিলিট অ্যানোমালি। Normalization এই অনাকাঙ্ক্ষিত ডেটা লস রোধ করে।
Problems Created by Normalization
1. Performance Issues:
- Multiple JOINs required for simple queries
- Increased query complexity and execution time
2. Development Complexity:
- More complex SQL queries
- Understanding relationships requires expertise
3. Maintenance Overhead:
- More tables to manage
- Complex referential integrity constraints
0NF: Unnormalized Form
0NF represents the raw, unstructured data যেখানে কোন normalization rules apply করা হয়নি। এখানে data থাকে flat file বা spreadsheet format এ।
Example - University Student System:
| Student_ID | Student_Name | Age | Courses | Course_Credits | Instructor_Names | Dept_Name | Dept_Location |
|---|---|---|---|---|---|---|---|
| 1 | Mamun | 22 | DBMS, Physics | 3, 4 | Dr. Khan, Dr. Rahman | CSE | Building A |
| 2 | Arafat | 21 | Math, Chemistry | 4, 3 | Dr. Ali, Dr. Hassan | Physics | Building B |
| 3 | Rashida | 23 | DBMS | 3 | Dr. Khan | CSE | Building A |
Critical Problems in 0NF:
- Multi-valued Attributes: *
Coursescolumn এ multiple values (DBMS, Physics)
Course_Creditscolumn এ multiple values (3, 4)Instructor_Namescolumn এ multiple values
- Data Redundancy:
CSEdepartment name এবংBuilding Alocation multiple times repeatDr. Khaninstructor name multiple times appear
- Storage Inefficiency:
- Same information multiple places এ store
- Unnecessary disk space consumption
- Data Anomalies:
- Insert Anomaly: নতুন course add করতে হলে পুরো student record দিতে হবে
- Update Anomaly: CSE department location change করতে হলে multiple rows update করতে হবে
- Delete Anomaly: Mamun কে delete করলে DBMS course এর information হারিয়ে যেতে পারে
33. Explain 1NF, 2NF, 3NF?
Step 1: 1NF Achieving Atomicity
1NF হল Normalization এর first step যেখানে আমরা ensure করি যে:
- Each cell contains atomic (indivisible) values
- Each row is unique (Primary Key দ্বারা)
- No repeating groups of data
Rules for 1NF:
- প্রতিটি column এ single value থাকতে হবে
- Multi-valued attributes eliminate করতে হবে
- Primary Key define করতে হবে row uniqueness এর জন্য
Conversion to 1NF:
Step 1: Break down multi-valued attributes
| Student_ID | Student_Name | Age | Course | Course_Credit | Instructor_Name | Dept_Name | Dept_Location |
|---|---|---|---|---|---|---|---|
| 1 | Mamun | 22 | DBMS | 3 | Dr. Khan | CSE | Building A |
| 1 | Mamun | 22 | Physics | 4 | Dr. Rahman | CSE | Building A |
| 2 | Arafat | 21 | Math | 4 | Dr. Ali | Physics | Building B |
| 2 | Arafat | 21 | Chemistry | 3 | Dr. Hassan | Physics | Building B |
| 3 | Rashida | 23 | DBMS | 3 | Dr. Khan | CSE | Building A |
Step 2: Define Primary Key
- Primary Key:
(Student_ID, Course) - এই composite key প্রতিটি row কে uniquely identify করে
Benefits of 1NF:
- ✅ Atomic values → easy searching, filtering, indexing
- ✅ Row uniqueness → prevents duplicate records
- ✅ Eliminates multi-valued attributes → cleaner data structure
- ✅ Query optimization → database engine can better optimize queries
Remaining Problems after 1NF:
- ❌ Data redundancy still exists (Student info repeats)
- ❌ Partial dependency exists (Student_Name depends only on Student_ID)
- ❌ Update anomalies persist ---
Step 2: 2NF Eliminating Partial Dependency
2NF achieve করতে হলে:
- Table must be in 1NF
- No partial dependency should exist
- Every non-key attribute must be fully functionally dependent on the entire primary key
Understanding Partial Dependency: Partial Dependency occurs যখন একটি non-key attribute শুধুমাত্র composite primary key এর একটি অংশের উপর depend করে।
In our 1NF table:
- Primary Key =
(Student_ID, Course) Student_Namedepends শুধুStudent_IDএর উপর,Courseএর উপর নাAgedepends শুধুStudent_IDএর উপরDept_Namedepends শুধুStudent_IDএর উপর
Functional Dependencies:
Student_ID→Student_Name, Age, Dept_Name, Dept_LocationCourse→Course_Credit, Instructor_Name(Student_ID, Course)→all attributes
Conversion to 2NF:
Step 1: Create Student Table
| Student_ID (PK) | Student_Name | Age | Dept_Name | Dept_Location |
|---|---|---|---|---|
| 1 | Mamun | 22 | CSE | Building A |
| 2 | Arafat | 21 | Physics | Building B |
| 3 | Rashida | 23 | CSE | Building A |
Step 2: Create Course Table
| Course_ID (PK) | Course_Name | Course_Credit | Instructor_Name |
|---|---|---|---|
| 101 | DBMS | 3 | Dr. Khan |
| 102 | Physics | 4 | Dr. Rahman |
| 103 | Math | 4 | Dr. Ali |
| 104 | Chemistry | 3 | Dr. Hassan |
Step 3: Create Enrollment Table (Junction Table)
| Student_ID (FK) | Course_ID (FK) |
|---|---|
| 1 | 101 |
| 1 | 102 |
| 2 | 103 |
| 2 | 104 |
| 3 | 101 |
Key Concepts in 2NF:
- Foreign Key (FK): Reference to primary key of another table
- Junction Table: Manages many-to-many relationship between Student and Course
- Referential Integrity: FK values must exist in referenced table
Benefits of 2NF:
- ✅ Eliminates partial dependency * ✅ Reduces data redundancy significantly
- ✅ Insert anomaly solved: Can add new course without student
- ✅ Update anomaly reduced: Change student name only once
- ✅ Storage efficiency improved Remaining Problems after 2NF:
- ❌ Transitive dependency exists (Dept_Name depends on Student_ID through department)
- ❌ Some redundancy remains ---
Step 3: 3NF Eliminating Transitive Dependency
3NF achieve করতে হলে:
- Table must be in 2NF
- No transitive dependency should exist
- Non-key attributes should not depend on other non-key attributes
Understanding Transitive Dependency: Transitive Dependency occurs যখন:
- A → B (A determines B)
- B → C (B determines C)
- Therefore: A → C (A transitively determines C)
In our Student table:
Student_ID→Dept_Name(Student belongs to a department)Dept_Name→Dept_Location(Department has a location)- Therefore:
Student_ID→Dept_Location(transitive dependency)
Conversion to 3NF:
Step 1: Create Department Table
| Dept_ID (PK) | Dept_Name | Dept_Location | Dept_Head | Established_Year |
|---|---|---|---|---|
| 10 | CSE | Building A | Dr. Ahmed | 1995 |
| 20 | Physics | Building B | Dr. Sultana | 1980 |
| 30 | Math | Building C | Dr. Karim | 1975 |
Step 2: Update Student Table
| Student_ID (PK) | Student_Name | Age | Dept_ID (FK) |
|---|---|---|---|
| 1 | Mamun | 22 | 10 |
| 2 | Arafat | 21 | 20 |
| 3 | Rashida | 23 | 10 |
Step 3: Course Table (Enhanced)
| Course_ID (PK) | Course_Name | Course_Credit | Instructor_ID (FK) | Dept_ID (FK) |
|---|---|---|---|---|
| 101 | DBMS | 3 | 501 | 10 |
| 102 | Physics | 4 | 502 | 20 |
| 103 | Math | 4 | 503 | 30 |
| 104 | Chemistry | 3 | 504 | 20 |
Step 4: Create Instructor Table
| Instructor_ID (PK) | Instructor_Name | Qualification | Dept_ID (FK) |
|---|---|---|---|
| 501 | Dr. Khan | PhD in CS | 10 |
| 502 | Dr. Rahman | PhD in Physics | 20 |
| 503 | Dr. Ali | PhD in Math | 30 |
| 504 | Dr. Hassan | PhD in Chem | 20 |
Step 5: Enrollment Table (unchanged)
| Student_ID (FK) | Course_ID (FK) | Enrollment_Date | Grade |
|---|---|---|---|
| 1 | 101 | 2024-01-15 | A |
| 1 | 102 | 2024-01-15 | B+ |
| 2 | 103 | 2024-01-16 | A- |
| 2 | 104 | 2024-01-16 | B |
| 3 | 101 | 2024-01-17 | A+ |
Benefits of 3NF:
-
✅ Eliminates transitive dependency completely * ✅ Maximum data redundancy reduction * ✅ All anomalies eliminated:
-
Insert: Can add department without student
-
Update: Change department location once
-
Delete: Deleting student doesn't affect department info
-
✅ Optimal storage utilization * ✅ Enhanced data integrity * ✅ Better database maintenance Types of Dependencies Eliminated:
- Multi-valued Dependencies: Eliminated in 1NF
- Partial Dependencies: Eliminated in 2NF
- Transitive Dependencies: Eliminated in 3NF
34. When to Use Each Normal Form
নরমালাইজেশনের প্রতিটি লেভেলের নিজস্ব গুরুত্ব রয়েছে। তবে প্র্যাকটিক্যাল ডাটাবেস ডিজাইনে সবসময় সব টেবিলকে সর্বোচ্চ লেভেল পর্যন্ত নরমালাইজ করা হয় না। কখন কোন ফরমটি ব্যবহার করবেন, তা নির্ভর করে আপনার সিস্টেমের প্রয়োজন এবং পারফরম্যান্সের ওপর।
নিচে একটি গাইডলাইন দেওয়া হলো:
১. First Normal Form (1NF) কখন ব্যবহার করবেন?
ব্যবহার: প্রতিটি ডাটাবেস টেবিলের জন্য এটি বাধ্যতামূলক।
- যখন আপনার টেবিলের কোনো কলামে কমা দিয়ে একাধিক ভ্যালু (যেমন: একাধিক ফোন নম্বর বা স্কিল) থাকে, তখন 1NF ব্যবহার করে সেগুলোকে আলাদা করতে হয়।
- উদ্দেশ্য: ডেটা সার্চিং এবং query সহজ করা।
২. Second Normal Form (2NF) কখন ব্যবহার করবেন?
ব্যবহার: যখন আপনার টেবিলে Composite Primary Key (একাধিক কলাম মিলে একটি কি) থাকে।
- যদি দেখেন কোনো কলাম পুরো প্রাইমারি কি-র ওপর নির্ভর না করে কেবল একটি অংশের ওপর নির্ভর করছে (Partial Dependency), তখন সেটিকে আলাদা টেবিলে নিয়ে যান।
- উদ্দেশ্য: একই তথ্য বারবার ইনসার্ট করা বন্ধ করা (Redundancy কমানো)।
৩. Third Normal Form (3NF) কখন ব্যবহার করবেন?
ব্যবহার: বেশিরভাগ Transactional (OLTP) সিস্টেমের জন্য এটি গোল্ডেন স্ট্যান্ডার্ড।
- যদি একটি নন-কি কলাম অন্য একটি নন-কি কলামের ওপর নির্ভর করে (যেমন: জিপ কোড জানলে সিটি জানা যায়), তবে 3NF ব্যবহার করে সিটিকে আলাদা টেবিলে রাখতে হয়।
- উদ্দেশ্য: ডেটা update এবং ডিলিট করার সময় ইনকনসিস্টেন্সি বা Anomaly দূর করা।
৪. Boyce-Codd Normal Form (BCNF) কখন ব্যবহার করবেন?
ব্যবহার: যখন একটি টেবিলে একাধিক ওভারল্যাপিং ক্যান্ডিডেট কি (Candidate Keys) থাকে।
- এটি 3NF-এর একটি শক্তিশালী সংস্করণ। সাধারণত জটিল সিস্টেম (যেমন: ফিন্যান্সিয়াল বা সায়েন্টিফিক ডাটাবেস) যেখানে ডেটার নির্ভুলতা ১০০% নিশ্চিত করতে হয়, সেখানে এটি ব্যবহৃত হয়।