কেন Alternate Key দরকার?
- Student ID — ভর্তির সময় দেওয়া নাম্বার
- Registration Number — সরকার থেকে দেওয়া রেজিস্ট্রেশন নাম্বার
- University Email — বিশ্ববিদ্যালয়ের দেওয়া ইমেইল
- National ID — জাতীয় পরিচয়পত্র নাম্বার
- একজন মানুষের কি দুইটা National ID থাকতে পারে?
- দুইজন স্টুডেন্টের কি একই University Email থাকতে পারে?
- যদি চারটা কলামই ইউনিক হয়, তাহলে আমরা কেন মাত্র একটাকে "প্রধান পরিচয়" (Primary Key) বানাই?
উত্তর সোজা — একজন মানুষের একটাই National ID থাকে, দুইজন স্টুডেন্টের কখনো একই Email হয় না। তাহলে চারটাই তো "পরিচয়" হিসেবে কাজ করতে পারে! কিন্তু ডাটাবেসে আমরা একটা টেবিলের জন্য একটামাত্র প্রধান কলাম বাছি, যেটাকে আমরা বলি Primary Key। বাকিগুলো একেবারে ফেলে দিই না — তারা থেকে যায় "ব্যাকআপ পরিচয়" হিসেবে। এই ব্যাকআপ পরিচয়গুলোকেই বলে Alternate Key।
সবগুলোই ইউনিক — কিন্তু মাত্র একটা বাছা হয়েছে প্রধান পরিচয় (⭐) হিসেবে। বাকিগুলো Alternate Key।
Alternate Key আসলে কী?
এখন শূন্য থেকে টেকনিক্যালি বুঝি। ডাটাবেসের একটা টেবিলে তিন ধরনের "Key" নিয়ে আমরা কাজ করি:
Candidate Key প্রার্থী
যেসব কলাম টেবিলের প্রতিটা সারিকে (row) একা-একাই ইউনিকভাবে শনাক্ত করতে পারে। এরা সবাই "প্রাইমারি কি হওয়ার প্রার্থী"।
Primary Key নির্বাচিত
Candidate Key-দের মধ্য থেকে যেটাকে আমরা "প্রধান পরিচয়" হিসেবে বাছি। প্রতি টেবিলে একটাই থাকে।
Alternate Key অবশিষ্ট
যেসব Candidate Key প্রাইমারি হিসেবে বাছা হয়নি, তারাই Alternate Key। এরাও এখনো ইউনিক, শুধু "মেইন" নয়।
Candidate Key → একটা Primary Key + বাকিগুলো Alternate Key
Candidate Key vs Primary Key vs Alternate Key
| বৈশিষ্ট্য | Candidate Key | Primary Key | Alternate Key |
|---|---|---|---|
| উদ্দেশ্য | ইউনিক শনাক্তকরণের প্রার্থী | টেবিলের মূল/অফিসিয়াল শনাক্তকারী | ব্যাকআপ ইউনিক শনাক্তকারী |
| সংখ্যা (প্রতি টেবিলে) | এক বা একাধিক | ঠিক ১টা | ০ বা একাধিক |
| Uniqueness | হ্যাঁ (বাধ্যতামূলক) | হ্যাঁ (বাধ্যতামূলক) | হ্যাঁ (বাধ্যতামূলক) |
| NULL অনুমোদন? | হতে পারে (কিন্তু সাধারণত না) | না — কখনোই NULL নয় | সাধারণত না (UNIQUE constraint-এ MySQL একাধিক NULL অনুমোদন করে) |
| বাছাই প্রক্রিয়া | স্বয়ংক্রিয়ভাবে চিহ্নিত হয় ডিজাইনের সময় | Candidate Key থেকে ডিজাইনার বেছে নেন | বাছাই না হওয়া Candidate Key গুলো |
| বাস্তব ব্যবহার | Student_ID, Email, Reg_No সবই | Student_ID | Email, Reg_No |
Alternate Key vs Unique Key
| বিষয় | Alternate Key | Unique Key (SQL-এ) |
|---|---|---|
| স্তর | ডাটাবেস ডিজাইন থিওরির কনসেপ্ট | SQL-এর একটা প্র্যাকটিক্যাল constraint |
| সম্পর্ক | এটাকে বাস্তবায়ন করা হয় | UNIQUE constraint দিয়ে Alternate Key বাস্তবায়িত হয় |
Candidate Key vs Composite Key
| বিষয় | Candidate Key | Composite Key |
|---|---|---|
| সংজ্ঞা | একা একটা কলাম (বা কলাম সেট) যা রো-কে ইউনিক করে | একাধিক কলাম মিলে একসাথে ইউনিক হয় |
| উদাহরণ | Student_ID একাই যথেষ্ট | (Student_ID + Course_ID) মিলে একটা "Enrollment" ইউনিক করে |
বাস্তব-জগতের উদাহরণ
🎓 University Database
Student_ID PK
Registration_Number AK
University_Email AK
🏢 Employee Database
Employee_ID PK
National_ID AK
Office_Email AK
🛒 Customer Database
Customer_ID PK
Email AK
Phone Number (যদি ইউনিক হয়) AK
🚗 Vehicle Registration
Vehicle_ID PK
Registration_Number AK
Chassis_Number AK
- Vehicle_ID কেন Primary Key, Chassis_Number কেন না? — কারণ Vehicle_ID ছোট, নিয়ন্ত্রিত, আর ডাটাবেস নিজেই তৈরি করে। Chassis_Number দৈর্ঘ্যে বড় ও প্রস্তুতকারক-নির্ভর।
- Phone Number কেন সবসময় ভালো Primary বা এমনকি Alternate Key না? — কারণ মানুষ নাম্বার বদলায়, এবং কখনো কখনো শেয়ার করে (পারিবারিক নাম্বার)।
মূলনীতি: Primary Key হওয়ার জন্য একটা কলাম হতে হবে — স্থির (stable), ছোট, কখনো না বদলানো, আর সহজে ইনডেক্স করা যায় এমন। যেগুলো এই শর্ত পূরণ করে না কিন্তু তবুও ইউনিক, তারা Alternate Key থেকে যায়।
SQL-এ Alternate Key ইমপ্লিমেন্ট করা
আমরা একটা Employees টেবিল বানাবো। ধরে নিচ্ছি তোমরা এর আগে কখনো SQL লেখোনি — তাই প্রতিটা লাইন ব্যাখ্যা করা হবে।
ধাপ ১ — ডাটাবেস তৈরি
-- একটা নতুন ডাটাবেস তৈরি হচ্ছে CREATE DATABASE company_db; USE company_db;
Query OK, 1 row affected Database changed
লাইন-বাই-লাইন: CREATE DATABASE একটা নতুন খালি ডাটাবেস বানায়। USE বলে দেয় এখন থেকে সব কমান্ড এই ডাটাবেসের ভেতরে চলবে।
ধাপ ২ — Primary Key ও Alternate Key সহ টেবিল
CREATE TABLE Employees ( Employee_ID INT AUTO_INCREMENT PRIMARY KEY, National_ID VARCHAR(20) NOT NULL UNIQUE, Office_Email VARCHAR(100) NOT NULL UNIQUE, Phone_Number VARCHAR(20), Full_Name VARCHAR(100) NOT NULL );
Query OK, 0 rows affected Table 'Employees' created
লাইন-বাই-লাইন ব্যাখ্যা:
Employee_ID ... PRIMARY KEY— এটাই আমাদের প্রধান পরিচয়, স্বয়ংক্রিয়ভাবে বাড়ে (AUTO_INCREMENT)।National_ID ... UNIQUE— এটা Alternate Key; ডুপ্লিকেট হতে দেবে না।Office_Email ... UNIQUE— এটাও Alternate Key।Phone_Number— এখানে UNIQUE নেই, কারণ ফোন নাম্বার শেয়ার হতে পারে (তাই এটা Candidate Key নয়)।
NOT NULL UNIQUE একসাথে ব্যবহার করো, যাতে খালি মান আর ডুপ্লিকেট — দুটোই আটকানো যায়।ধাপ ৩ — বৈধ রেকর্ড ইনসার্ট করা
INSERT INTO Employees (National_ID, Office_Email, Phone_Number, Full_Name) VALUES ('19850012345', 'rahim@company.com', '01711000111', 'Rahim Uddin'), ('19900098765', 'karim@company.com', '01911000222', 'Karim Hossain');
Query OK, 2 rows affected SELECT * FROM Employees; +-------------+--------------+--------------------+--------------+---------------+ | Employee_ID | National_ID | Office_Email | Phone_Number | Full_Name | +-------------+--------------+--------------------+--------------+---------------+ | 1 | 19850012345 | rahim@company.com | 01711000111 | Rahim Uddin | | 2 | 19900098765 | karim@company.com | 01911000222 | Karim Hossain | +-------------+--------------+--------------------+--------------+---------------+
ধাপ ৪ — ডুপ্লিকেট ঢোকানোর চেষ্টা (Alternate Key কাজ করছে!)
INSERT INTO Employees (National_ID, Office_Email, Phone_Number, Full_Name) VALUES ('19850012345', 'new_rahim@company.com', '01700000000', 'Fake Rahim');
ERROR 1062 (23000): Duplicate entry '19850012345' for key 'National_ID'
এখানে দেখো — Employee_ID ভিন্ন হলেও, National_ID (Alternate Key) আগে থেকেই আছে, তাই MySQL এই রেকর্ড প্রত্যাখ্যান করেছে। এটাই Alternate Key-এর আসল কাজ — একই বাস্তব মানুষকে দুইবার ভিন্ন Employee_ID দিয়ে ঢুকতে না দেওয়া।
বিজনেস কেস স্টাডি — Employee Management System
Employee_ID, National_ID, Office_Email, Phone_Number। প্রশ্ন: কোনটা Primary Key হবে, আর কোনগুলো Alternate Key?
| কলাম | ইউনিক? | স্থির (Stable)? | সিদ্ধান্ত |
|---|---|---|---|
| Employee_ID | হ্যাঁ | হ্যাঁ (সিস্টেম-জেনারেটেড) | Primary Key |
| National_ID | হ্যাঁ | হ্যাঁ | Alternate Key |
| Office_Email | হ্যাঁ | মোটামুটি (পদ বদলালে বদলাতে পারে) | Alternate Key |
| Phone_Number | না (শেয়ার হতে পারে) | না (প্রায়ই বদলায়) | Candidate Key নয় |
কেন Employee_ID-ই সেরা পছন্দ? কারণ এটা ছোট, স্থির, আর সিস্টেম নিজে তৈরি করে বলে কখনো বদলায় না। National_ID যদিও পুরোপুরি স্থির ও ইউনিক, তবুও বেশিরভাগ প্রতিষ্ঠান এটাকে Primary বানায় না — কারণ এটা সংবেদনশীল ব্যক্তিগত তথ্য, আর ভবিষ্যতে অন্য টেবিলে ফরেন কি হিসেবে বারবার ব্যবহার করলে ডেটাবেস ভারী ও ঝুঁকিপূর্ণ হয়ে যায়।
ER ডায়াগ্রাম: একটাই 🔑 Primary Key, একাধিক 🔷 Alternate Key
প্র্যাকটিক্যাল সেশন — MySQL Workbench / Google Colab
এখন সবাই নিজের হাতে করবে। ধাপে ধাপে অনুসরণ করো — কেউ SQL আগে লেখোনি ধরেই এগোচ্ছি।
ধাপ ১: ডাটাবেস বানাও
CREATE DATABASE practice_db; USE practice_db;
Database created and selected
ধাপ ২: টেবিল বানাও + Primary/Alternate Key দাও
CREATE TABLE Students ( Student_ID INT AUTO_INCREMENT PRIMARY KEY, Registration_Number VARCHAR(20) NOT NULL UNIQUE, University_Email VARCHAR(100) NOT NULL UNIQUE, Student_Name VARCHAR(100) NOT NULL );
Table 'Students' created
ধাপ ৩: বৈধ ডেটা ইনসার্ট করো
INSERT INTO Students (Registration_Number, University_Email, Student_Name) VALUES ('REG-2024-001', 'nabila@uni.edu.bd', 'Nabila Islam');
1 row inserted (Student_ID = 1, auto-generated)
ধাপ ৪: ডুপ্লিকেট ঢোকানোর চেষ্টা করো
INSERT INTO Students (Registration_Number, University_Email, Student_Name) VALUES ('REG-2024-001', 'another@uni.edu.bd', 'Someone Else');
ERROR 1062: Duplicate entry 'REG-2024-001' for key 'Registration_Number'
ধাপ ৫: কেন এই এরর হলো তা ব্যাখ্যা করো
কারণ Registration_Number-কে আমরা UNIQUE constraint দিয়ে Alternate Key বানিয়েছি। MySQL নিজে থেকেই ডুপ্লিকেট আটকে দিয়েছে — আমাদের কোনো অতিরিক্ত কোড লিখতে হয়নি।
সাধারণ বিগিনার ভুল
ব্যবহারিক সমাধান: টেবিল ডিজাইন করার আগে কাগজে লিখে ফেলো — কোন কলামগুলো ইউনিক হতে পারে (Candidate Key তালিকা), তারপর সবচেয়ে স্থির ও ছোট কলামটাকে Primary বানাও, বাকিদের UNIQUE constraint দাও।
ইন্ডাস্ট্রি বেস্ট প্র্যাকটিস
স্থির Primary Key বাছা
সিস্টেম-জেনারেটেড, ছোট, কখনো না বদলানো ID (যেমন AUTO_INCREMENT INT বা UUID) ব্যবহার করো — বাস্তব-জগতের ডেটার উপর নির্ভর কোরো না।
Alternate Key সত্যিকারের ইউনিক রাখা
UNIQUE constraint দাও এবং নিয়মিত ডেটা কোয়ালিটি চেক করো, যাতে অ্যাপ্লিকেশন লেভেলের বাগ দিয়ে ডুপ্লিকেট ঢুকে না যায়।
ঘন ঘন বদলানো মান এড়ানো
ফোন নাম্বার, ঠিকানা, পদবি — এগুলো Key হিসেবে ব্যবহার না করাই ভালো, কারণ এরা সময়ের সাথে বদলায়।
নামকরণ ও ডকুমেন্টেশন
প্রতিটা Alternate Key স্পষ্টভাবে ডকুমেন্ট করো (কেন এটা UNIQUE, কেন এটা Primary নয়) — যাতে ভবিষ্যতের ডেভেলপার বুঝতে পারে।
ক্লাসরুম ইন্টারঅ্যাকটিভ অ্যাক্টিভিটি
অ্যাক্টিভিটি ১ — Candidate Key খুঁজে বের করো
একটা "Hospital Patient" টেবিলে কলাম আছে: Patient_ID, National_ID, Health_Card_Number, Phone_Number, Name। কোনগুলো Candidate Key?
অ্যাক্টিভিটি ২ — সেরা Primary Key বাছো
উপরের Candidate Key গুলোর মধ্যে কোনটা Primary Key হওয়া উচিত এবং কেন — গ্রুপে আলোচনা করো।
অ্যাক্টিভিটি ৩ — ডিজাইনের ভুল খুঁজে বের করো
একটা টেবিলে দুইটা Primary Key ঘোষণা করা হয়েছে — এটা কেন ভুল, ব্যাখ্যা করো।
অ্যাক্টিভিটি ৪ — নিজের ডিজাইন বানাও
একটা "Library Management" সিস্টেমের জন্য Candidate, Primary, এবং Alternate Key সহ একটা টেবিল ডিজাইন করো।
রিভিশন ও কুইজ
দ্রুত রিভিশন নোট
- Candidate Key = ইউনিক শনাক্তকরণের যোগ্য সব কলাম
- Primary Key = Candidate Key থেকে বাছাই করা একমাত্র প্রধান কলাম
- Alternate Key = বাছাই না হওয়া বাকি Candidate Key গুলো
- Alternate Key বাস্তবায়িত হয় UNIQUE constraint দিয়ে
- Primary Key কখনো NULL হতে পারে না; Alternate Key-ও সাধারণত NOT NULL রাখা হয়
ইন্টারঅ্যাকটিভ কুইজ
(ক) ৩টা (খ) ১টা (গ) যত ইচ্ছা (ঘ) ০টা
(ক) FOREIGN KEY (খ) CHECK (গ) UNIQUE (ঘ) DEFAULT
(ক) Alternate Key (খ) Foreign Key (গ) Composite Key (ঘ) Super Key শুধু
(ক) এটা সংখ্যা (খ) এটা বদলাতে/শেয়ার হতে পারে (গ) এটা টেক্সট আকারে থাকে (ঘ) এটা খুব লম্বা
বোনাস ১ Database Key-এর সংক্ষিপ্ত ইতিহাস
বোনাস ২ মিনি প্রজেক্ট — University Management System
নিচের টেবিলটা একসাথে বানাই, যেখানে Candidate Key, Primary Key নির্বাচন, এবং Alternate Key সবকিছু একসাথে দেখানো হয়েছে।
CREATE TABLE Students ( Student_ID INT AUTO_INCREMENT PRIMARY KEY, Registration_No VARCHAR(20) NOT NULL UNIQUE, University_Email VARCHAR(100) NOT NULL UNIQUE, National_ID VARCHAR(20) NOT NULL UNIQUE, Full_Name VARCHAR(100) NOT NULL, Department VARCHAR(50) ); INSERT INTO Students (Registration_No, University_Email, National_ID, Full_Name, Department) VALUES ('REG-001', 'anika@uni.edu.bd', '19980011122', 'Anika Rahman', 'CSE'), ('REG-002', 'tanvir@uni.edu.bd', '19970022233', 'Tanvir Ahmed', 'EEE');
+------------+----------------+---------------------+--------------+---------------+------------+ | Student_ID | Registration_No| University_Email | National_ID | Full_Name | Department | +------------+----------------+---------------------+--------------+---------------+------------+ | 1 | REG-001 | anika@uni.edu.bd | 19980011122 | Anika Rahman | CSE | | 2 | REG-002 | tanvir@uni.edu.bd | 19970022233 | Tanvir Ahmed | EEE | +------------+----------------+---------------------+--------------+---------------+------------+
ফলাফল: Student_ID হলো Primary Key; Registration_No, University_Email, National_ID — তিনটাই Alternate Key, প্রতিটাই আলাদা UNIQUE constraint দিয়ে সুরক্ষিত।
বোনাস ৩ প্রফেশনাল ওয়ার্কফ্লো
Database Architect
বিজনেস রিকোয়ারমেন্ট থেকে সব সম্ভাব্য Candidate Key চিহ্নিত করেন এবং কোনটা স্থিতিশীল তা যাচাই করেন।
DBA (Database Administrator)
Primary ও Alternate Key-এর উপর ইনডেক্স ও constraint বাস্তবায়ন এবং পারফরম্যান্স মনিটর করেন।
Data Engineer
ডেটা পাইপলাইনে Alternate Key ব্যবহার করে ডুপ্লিকেট রেকর্ড মার্জ বা সনাক্ত করেন (deduplication)।
Data Analyst
রিপোর্টিং-এর সময় Alternate Key (যেমন Email) দিয়ে বিভিন্ন সিস্টেমের ডেটা জোড়া লাগান (join/match)।
বোনাস ৪ শীর্ষ ৩০টি বিগিনার ইন্টারভিউ প্রশ্ন
শেষ ক্লাস এক্সারসাইজ ও হোমওয়ার্ক
ক্লাসরুম এক্সারসাইজ
একটা "Hospital" ডাটাবেসে Doctor টেবিল বানাও যেখানে Doctor_ID (Primary), BMDC_Registration_No এবং Office_Email (Alternate Key) থাকবে। UNIQUE constraint সহ সম্পূর্ণ CREATE TABLE কোয়েরি লেখো।
হোমওয়ার্ক অ্যাসাইনমেন্ট
১. একটা "Online Bookstore" সিস্টেমের জন্য Book টেবিল ডিজাইন করো — কমপক্ষে ৩টা Candidate Key খুঁজে বের করে একটাকে Primary ও বাকিদের Alternate Key বানাও।
২. উপরের টেবিলে বৈধ ডেটা ইনসার্ট করো, তারপর ইচ্ছাকৃতভাবে একটা ডুপ্লিকেট Alternate Key ইনসার্ট করার চেষ্টা করো এবং এররটা স্ক্রিনশট নিয়ে জমা দাও।
৩. লিখে ব্যাখ্যা করো — কেন তুমি নির্দিষ্ট কলামটাকে Primary Key হিসেবে বাছলে, বাকিদের কেন না।