আমরা গত পর্বে দেখেছিলাম নরমালাইজেশন এর বেসিক অংশ এবং First Normal form (1NF)। এ পর্বে আমরা আলোচনা করব Database Normalization (2NF and 3NF), Second Normal form (2NF) এবং Third Normal form (3NF) নিয়ে।
Second Normal form (2NF) এর জন্য দুইটি শর্ত পূরণ করতে হবে –
১) টেবিলটি First Normal form (1NF) এ থাকতে হবে
২) কোনও non-prime অথবা non-key attribute, candidate key এর subset এর উপর নির্ভরশীল হতে পারবে না।
এখন প্রশ্ন হচ্ছে candidate key কি?
candidate key মানে এমন কলাম যা একটি টেবিলের প্রতিটি রেক কে আলাদা ভাবে চিহ্নিত করতে পারে। একটি টেবিলের এক বা একাধিক candidate key থাকতে পারে। এর মধ্যে একটি বিশেষ candidate key কে আমরা primary key বলি। যে attribute/column কোনও candidate key এর অংশ নয় তাকে non-prime attribute অথবা non-key attribute বলে।
আমদের গত ব্লগের Student টেবিলটি First normal form (1NF) এ আছে। আমাদের দ্বিতীয় শর্তটি পূরণ করতে হবে। Student টেবিল থেকে আমরা লক্ষ্ করি যে, {stdRoll, subjectName} কলাম দুটি মিলে হচ্ছে একটা candidate key এবং name, department, semester কলামগুলো হচ্ছে non-prime attribute।
এখন name, department, semester কলামগুলি শুধুমাত্র stdRoll কলামের উপর নির্ভরশীল এবং stdRoll হল candidate key: { stdRoll, subjectName } এর একটি subset।
আমরা Student টেবিলটিকে নিচের মত করে Second normal form (2NF) এ নিতে পারি। আমারা একটি নতুন টেবিল Student_Subject তৈরি করলাম স্টুডেন্ট এবং সাবজেক্ট এর মধ্যে সম্পর্ক ঠিক রাখার জন্য।
Table: Student
Students Roll | name | department | semester |
40101 | Md. Kamrul Islam | Computer | First |
40102 | Ruhul Amin | Electrical | Third |
40103 | Rejaul Karim | Civil | Fourth |
40104 | Fayej Chowdhury | Textile | Seventh |
40105 | Faria Rahman | AIDT | First |
Table: Student Subject
Students Roll | Subject Name |
40101 | Bangla |
40101 | English |
40101 | Mathematics |
40102 | Bangla |
40102 | ICT |
40102 | Mathematics |
40103 | Bangla |
40103 | English |
40103 | ICT |
40104 | Programming in Java |
40104 | English |
40104 | Mathematics |
40105 | Bangla |
40105 | English |
40105 | DBMS |
তাহলে আমাদের ডাটাবেজ এখন Second normal form (2NF)-এ চলে আসল। এবারে আমরা শেষ ধাপে যাব এবং একে Third normal form (3NF)-এ নেব। যার মাধ্যমে আমাদের নরমালাইজেশন করার প্রক্রিয়াটি সম্পন্ন হবে।
Third normal form (3NF) এ নেওয়ার জন্য আমদের নিচের দুটি শর্ত পূরণ করতে হবে –
১) টেবিল Second normal form (2NF) এ থাকতে হবে
২) কোনো Transitive functional dependency থাকতে পারবে না
এটা আবার কি?
Transitive functional dependency – মনে করি একটি টেবিলের প্রাইমারি কি (primary key) হচ্ছে A এবং এই টেবিলের দুটি নন-প্রাইম (non-prime) কলাম হচ্ছে B এবং C, যেখানে C কলামের ভ্যালু যতটা A কলামের ভ্যালুর উপরে নির্ভরশীল তার চাইতে B কলামের ভ্যালুর উপর বেশি নির্ভরশীল, আবার B কলামের ভ্যালু A কলামের ভ্যালুর উপরে সরাসরি নির্ভরশীল, তাহলে আমরা বলতে পারি যে C কলাম transitively কলাম A এর উপর নির্ভরশীল। ওই যে, ছাগল ঘাস খায়, মানুষ ছাগল খায়, তার মানে মানুষ ঘাস খায় – এরকম লজিক আর কী।]
আমাদের Student টেবিলটিতে stdRoll হচ্ছে প্রাইমারি কি (primary key) এবং department আর semester হচ্ছে দুটি নন-প্রাইম (non-prime) কলাম। আমরা লক্ষ করি যে, semester কলামটি যতটা studentId কলামের উপরে নির্ভরশীল তার চাইতে বেশি নির্ভরশীল department কলামটির উপরে এবং department কলামটি আবার stdRoll কলামের উপরে সরাসরি নির্ভরশীল(যেহেতু student এর পরিচয় তার department)। সুতরাং আমরা বলতে পারি যে semester কলামটি transitively কলাম stdRoll এর উপর নির্ভরশীল।
তাই Student টেবিলটিকে Third normal form (3NF)-এ নিতে নিচের মতো পরিবর্তন করতে পারি এবং dep_semester নামে একটি নতুন টেবিল তৈরি করতে পারি –
Table: Student
Students Roll | name | department |
40101 | Md. Kamrul Islam | Computer |
40102 | Ruhul Amin | Electrical |
40103 | Rejaul Karim | Civil |
40104 | Fayej Chowdhury | Textile |
40105 | Faria Rahman | AIDT |
Table: dep_semester
department | semester |
Computer | First |
Electrical | Third |
Civil | Fourth |
Textile | Seventh |
AIDT | First |
Table: StudentSubject
Students Roll | Subject Name |
40101 | Bangla |
40101 | English |
40101 | Mathematics |
40102 | Bangla |
40102 | ICT |
40102 | Mathematics |
40103 | Bangla |
40103 | English |
40103 | ICT |
40104 | Programming in Java |
40104 | English |
40104 | Mathematics |
40105 | Bangla |
40105 | English |
40105 | DBMS |
তাহলে আমরা নরমালাইজেশন করতে গিয়ে একটি টেবিল কে ভেঙে তিনটি টেবিলে রূপান্তর করলাম। আশা করি আপনারা বুঝতে পেরেছেন কেন আমরা একটি টেবিল কে ভেঙে তিনটি টেবিলে রূপান্তর করেছে। এইরকম আরো তিন থেকে চারটি টেবিলকে ভেঙে নরমালাইজেশন চর্চা করুন। আশা করি নরমালাইজেশন এর কনসেপ্ট আপনাদের কাছে ক্লিয়ার হবে। যত বেশি চর্চা করব ততবেশি নরমালাইজেশন টা আমরা বুঝতে পারবো ধন্যবাদ সবাইকে।
জহির আহমেদ চৌধুরী
ইন্সট্রাক্টর, কম্পিউটার ডিপার্টমেন্ট