একটা সাধারণ ছক দিয়ে শুরু করি। ধরো তোমার স্কুল ছাত্রদের তথ্য রাখছে এভাবে —
| Roll | Name | Class |
|---|---|---|
| 101 | Rahim | XI |
| 102 | Karim | XI |
| 103 | Rahim | XII |
এই ছোট্ট ছকটার ভেতরেই পুরো অধ্যায়ের ধারণাগুলো লুকিয়ে আছে। খুলে দেখা যাক।
ডেটাবেজ হলো পরস্পর সম্পর্কযুক্ত ডেটার সংগঠিত সংগ্রহ, আর DBMS হলো সেই ডেটা তৈরি, সংরক্ষণ ও ব্যবস্থাপনার সফটওয়্যার।
ফিল্ড আর রেকর্ড
উপরের ছকে Roll, Name, Class — এই তিনটে কলাম হলো ফিল্ড। আর Rahim-এর পুরো সারিটা, অর্থাৎ ১০১, রহিম, একাদশ — এটা একটা রেকর্ড।
এই দুটো গুলিয়ে ফেলা খুব সাধারণ। মনে রাখার উপায় — ফিল্ড দাঁড়িয়ে থাকে, রেকর্ড শুয়ে থাকে।
প্রাইমারি কি কেন দরকার
এবার একটা সমস্যা দেখো। ছকে দুজন Rahim আছে।
কেউ যদি বলে “রহিমের তথ্য বের করো”, কম্পিউটার কোনটা বের করবে? Name দিয়ে খোঁজা যাবে না, কারণ নাম অনন্য নয়।
কিন্তু Roll দিয়ে খোঁজা যাবে, কারণ দুজনের রোল কখনো এক হয় না। এই যে অনন্য ফিল্ড, যা দিয়ে প্রতিটা রেকর্ডকে আলাদা করে চেনা যায় — এটাই প্রাইমারি কি।
শর্ত দুটো। মান কখনো ফাঁকা রাখা যাবে না, আর একই মান দুবার আসতে পারবে না।
পরীক্ষায় প্রাইমারি কি বাছাইয়ের প্রশ্ন এলে এই যুক্তিটাই লেখো — নাম বা ঠিকানা প্রাইমারি কি হতে পারে না, কারণ দুজনের এক হতে পারে।
ফরেন কি আর দুটো টেবিল
এখন ধরো ক্লাসের শিক্ষকের নামও রাখতে চাও। একই টেবিলে যোগ করলে একাদশের প্রতিটা সারিতে একই শিক্ষকের নাম বারবার লিখতে হবে। শিক্ষক বদলালে সব সারি বদলাতে হবে।
তাই আলাদা একটা Class টেবিল বানাও, আর Student টেবিলে শুধু Class-এর উল্লেখ রাখো। এই যে এক টেবিলের ফিল্ড যা অন্য টেবিলের প্রাইমারি কি-কে নির্দেশ করছে — এটাই ফরেন কি। দুই টেবিলের মধ্যে সেতু।
আর একাধিক ফিল্ড মিলে যদি অনন্যতা তৈরি করে, সেটা কম্পোজিট কি।
ডেটা টাইপ বাছাই
প্রতিটা ফিল্ডের জন্য ঠিক করতে হয় সে কী ধরনের তথ্য রাখবে — Text অক্ষরের জন্য, Number সংখ্যার জন্য, Date/Time তারিখের জন্য, Currency টাকার জন্য, Boolean হ্যাঁ-না-র জন্য, Memo দীর্ঘ বর্ণনার জন্য।
একটা প্রশ্ন প্রায়ই আসে — মোবাইল নম্বরের ডেটা টাইপ কী?
উত্তর Text, Number নয়। দুটো কারণ। মোবাইল নম্বর দিয়ে যোগ-বিয়োগ করা হয় না, আর শুরুর ০ সংখ্যায় রাখলে মুছে যায় — ০১৭ হয়ে যাবে ১৭।
সর্টিং আর ইনডেক্সিং
দুটোই খোঁজা সহজ করে, কিন্তু আলাদা উপায়ে।
সর্টিং ডেটাকে ক্রমে সাজিয়ে দেয় — মূল ডেটার অবস্থানই বদলে যায়।
ইনডেক্সিং আলাদা একটা সূচি বানায়, বইয়ের শেষের নির্ঘণ্টের মতো। মূল ডেটা যেখানে ছিল সেখানেই থাকে।
পার্থক্যের প্রশ্নে এই শেষ লাইনটাই মূল উত্তর।
সম্পর্কের ধরন
One to One — একটার সাথে একটাই। একজন নাগরিক, একটা এনআইডি।
One to Many — একটার সাথে অনেক। একটা ক্লাসে অনেক ছাত্র। সবচেয়ে বেশি ব্যবহৃত।
Many to Many — অনেকের সাথে অনেক। একজন ছাত্র অনেক কোর্স নেয়, একটা কোর্স অনেকে নেয়।
SQL — টেবিলের সাথে কথা বলা
টেবিল বানাতে —
CREATE TABLE Student (
Roll INT,
Name VARCHAR(30)
);
তথ্য ঢোকাতে —
INSERT INTO Student VALUES (101, 'Rahim');
তথ্য দেখতে —
SELECT * FROM Student;
SELECT Name FROM Student WHERE Roll = 101;
তারকা চিহ্নটা মানে সব কলাম। নির্দিষ্ট কলাম চাইলে নাম লিখে দাও।
বদলাতে ও মুছতে —
UPDATE Student SET Name = 'Karim' WHERE Roll = 101;
DELETE FROM Student WHERE Roll = 101;
এই দুটোতে WHERE অংশটা খুব জরুরি। WHERE ছাড়া DELETE FROM Student; লিখলে টেবিলের প্রতিটা রেকর্ড মুছে যাবে — একটা শর্ত বাদ দেওয়ার এত বড় ফল আর কোথাও নেই।
DBMS ব্যবহারের হিসাব
সুবিধা — একই তথ্য বারবার রাখতে হয় না, নিরাপত্তা দেওয়া যায়, অনেকে একসাথে ব্যবহার করতে পারে, তথ্যে অসংগতি কমে, আর খোঁজা দ্রুত হয়।
অসুবিধাও আছে — খরচ বেশি, প্রশিক্ষিত লোক দরকার, আর সিস্টেম নষ্ট হলে একসাথে অনেক তথ্য ঝুঁকিতে পড়ে।
শুরুর ছকে ফিরে যাও
এখন নিজেকে প্রশ্ন করো — ওই তিন সারির ছকে প্রাইমারি কি কোনটা হবে এবং কেন? শিক্ষকের নাম রাখতে হলে টেবিলটা কীভাবে ভাঙবে? দুই টেবিলের সম্পর্কটা কোন ধরনের হবে?
আর একাদশ শ্রেণির সব ছাত্রের নাম দেখানোর SQL কমান্ডটা লিখে ফেলো।
এই চারটে প্রশ্নের উত্তর নিজে লিখতে পারলে অধ্যায়টা তোমার হয়ে গেছে।