সরাসরি পর্বে যান
পর্ব ০২ · ৬৭-এর মধ্যে · মডিউল ১

ফাইল সিস্টেম বনাম DBMS — ইতিহাস আর সমস্যা

File Systems vs DBMS — Why Databases Were Invented

Taught in Bangla, this lesson tells the story of a coaching centre with three offices and three files to show the seven problems of file-based systems: redundancy and inconsistency, new queries, format differences, hidden rules, partial updates, concurrent access and security. It then maps each problem to a DBMS feature with live SQL, discusses when plain files are enough, and covers IMS, CODASYL and Codd.

এই পর্বে যা শিখবেন

  • DBMS-এর আগে ডেটা কীভাবে রাখা ও প্রক্রিয়া করা হতো — খাতা, পাঞ্চ কার্ড, টেপ আর COBOL প্রোগ্রাম
  • ফাইল-ভিত্তিক ব্যবস্থার সাতটি সমস্যা, প্রতিটি একটি বাস্তব উদাহরণে
  • প্রতিটি সমস্যার বিপরীতে DBMS-এর কোন বৈশিষ্ট্য কাজ করে — লাইভ SQL চালিয়ে নিজে দেখা
  • কখন DBMS দরকার, আর কখন সাধারণ ফাইলই বুদ্ধিমানের কাজ
  • IMS, CODASYL, Bachman আর Codd — ডেটাবেসের জন্মের গল্প, আর spreadsheet-এর আধুনিক ফাঁদ

১ · DBMS-এর আগে — খাতা, কার্ড আর ফাইল

পাড়ার মুদি দোকানের বাকির খাতার কথা ভাবুন। প্রতিটি পাতায় একজন গ্রাহক, তারিখ ধরে লেখা কে কত টাকার জিনিস নিলেন। দোকানদার নিজেই লেখেন, নিজেই পড়েন। একজন মানুষ, একটি খাতা — কোনো সমস্যা নেই।

এবার ভাবুন দোকানটি বড় হলো। তিনজন কর্মচারী, দুটি ক্যাশ কাউন্টার, একটি গুদাম। গুদামের খাতা আলাদা, ক্যাশের খাতা আলাদা, বাকির খাতা আলাদা। মাস শেষে মালিক জানতে চাইলেন, “কোন পণ্য সবচেয়ে বেশি বিক্রি হলো, আর কোন গ্রাহকের বাকি সবচেয়ে বেশি?” উত্তর বের করতে কাউকে পুরো একটা দিন তিনটি খাতা পাশাপাশি রেখে মেলাতে হবে।

কম্পিউটার আসার পর প্রথম কয়েক দশকে প্রতিষ্ঠানগুলো ঠিক এই খাতাগুলোকেই কম্পিউটারে তুলেছিল — কাগজের বদলে flat file. Flat file মানে সাধারণ একটি ফাইল, যার প্রতিটি লাইনে একটি রেকর্ড; ফাইলের ভেতরে কোন অংশের কী মানে, তা লেখা থাকে না — জানে শুধু সেই ফাইল পড়ার প্রোগ্রাম।

📒 খাতা ও রেজিস্টার

হাতে লেখা হিসাব। একজন মানুষ একবারে একটি পাতা দেখেন। খোঁজা ধীর, কপি করা কষ্টকর, আগুন বা পানিতে সব শেষ।

মুদি দোকান, ভূমি অফিস, স্কুলের হাজিরা খাতা

🗂️ পাঞ্চ কার্ড ও টেপ

প্রতিটি কার্ডে বা টেপের প্রতিটি অংশে একটি রেকর্ড। পড়তে হয় শুরু থেকে শেষ পর্যন্ত ক্রমানুসারে — মাঝখান থেকে একটি রেকর্ড তুলে আনা যায় না।

১৯৫০–৬০-এর দশকের অফিস

💾 ফাইল + COBOL প্রোগ্রাম

ডিস্কে ফাইল, আর প্রতিটি কাজের জন্য একটি করে প্রোগ্রাম — বেতন হিসাবের প্রোগ্রাম, বিল ছাপার প্রোগ্রাম, রিপোর্টের প্রোগ্রাম। প্রোগ্রামই জানে ফাইলের গঠন।

ব্যাংক, বিমা, সরকারি অফিস

এই যুগের প্রধান ভাষা ছিল COBOL (COmmon Business-Oriented Language), যা ১৯৫৯ সালে একটি কমিটি তৈরি করে; এতে Grace Hopper-এর আগের কাজের বড় প্রভাব ছিল। COBOL প্রোগ্রামের শুরুতেই থাকে ফাইলের বর্ণনা — কোন রেকর্ডে কত অক্ষরের কোন ঘর। অর্থাৎ ডেটার গঠন লেখা থাকত প্রোগ্রামের ভেতরে, ডেটার সাথে নয়। এই একটি সিদ্ধান্ত থেকেই পরের সব সমস্যার জন্ম।

মূল ধারণা

File processing system: ডেটা থাকে অপারেটিং সিস্টেমের সাধারণ ফাইলে, আর প্রতিটি অ্যাপ্লিকেশন প্রোগ্রাম নিজেই ঠিক করে ফাইল কীভাবে পড়বে, লিখবে, যাচাই করবে। DBMS (Database Management System): ডেটা আর তার বর্ণনা (schema) এক জায়গায় থাকে; পড়া, লেখা, যাচাই, একসাথে কাজ আর নিরাপত্তার দায়িত্ব নেয় একটি আলাদা সফটওয়্যার, আর প্রোগ্রামগুলো তার কাছে শুধু চায় — “এই তথ্যটি চাই।”

পর্ব ০১-এ দেখেছেন ডেটা, তথ্য আর database বলতে কী বোঝায়। এই পর্বে প্রশ্ন একটাই — ফাইলেই তো ডেটা রাখা যায়, তাহলে আলাদা একটি DBMS-এর দরকার পড়ল কেন? উত্তর পেতে একটি গল্প ধরে এগোই।

২ · একটি কোচিং সেন্টারের গল্প — তিন অফিস, তিন ফাইল

রাজশাহীর একটি কোচিং সেন্টার, নাম ধরুন “আলোকিত কোচিং”। প্রায় ছয়শো শিক্ষার্থী। শুরুতে মালিক নিজেই সব খাতায় লিখতেন। পরে কম্পিউটার কেনা হলো, আর তিনটি অফিস যার যার মতো ফাইল বানাল:

  • ভর্তি অফিস — একটি Excel ফাইলে রোল, নাম, অভিভাবকের নাম, ফোন, ঠিকানা।
  • হিসাব অফিস — একজন প্রোগ্রামার বন্ধুর বানানো ছোট একটি প্রোগ্রাম, যা একটি text ফাইলে নির্দিষ্ট দৈর্ঘ্যের ঘরে রোল, নাম, ফোন আর মাসিক ফি রাখে।
  • পরীক্ষা অফিস — একটি CSV ফাইল (কমা দিয়ে আলাদা করা ঘর), যেখানে রোল, নাম, ফোন আর প্রতিটি পরীক্ষার নম্বর।

তিনটি ফাইলের ভেতরটা দেখুন — একই শিক্ষার্থী, তিন রকম চেহারা:

Roll | Name        | Guardian      | Phone       | Address
101  | Rafi Ahmed  | Kamal Ahmed   | 01711111111 | Shaheb Bazar
102  | Mim Akter   | Rokeya Begum  | 01822222222 | Uposhohor

Excel-এ কলামের নাম আছে, কিন্তু কোনো নিয়ম নেই — ফোনের ঘরে কেউ “নাই” লিখলেও Excel আপত্তি করে না।

0101Rafi Ahmed          01711111111001500
0102Mim Akter           01822222222001500

প্রথম ৪ অক্ষর রোল, পরের ২০ অক্ষর নাম, তারপর ১১ অক্ষর ফোন, শেষ ৬ অক্ষর মাসিক ফি (টাকা)। এই নিয়ম লেখা আছে শুধু প্রোগ্রামের কোডে — ফাইলে নয়।

roll,name,phone,mock1,mock2
101,Rafi Ahmed,01711111111,72,81
102,Mim Akhter,01822222222,88,79

খেয়াল করুন, এখানে Mim-এর নামের বানান “Akhter” — ভর্তি অফিসে “Akter”. কেউ ইচ্ছে করে ভুল করেননি; দুজন মানুষ দুবার টাইপ করেছেন।

প্রথম কয়েক মাস সব ঠিকঠাক চলল। তারপর একে একে সমস্যা দেখা দিতে লাগল। শিক্ষার্থীর সংখ্যা বাড়ল, অফিস বাড়ল, প্রশ্ন বাড়ল। এই সমস্যাগুলোই ডেটাবেসের পাঠ্যবইয়ে “file processing system-এর অসুবিধা” নামে পরিচিত — বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় বারবার আসে। আমরা একটি একটি করে দেখব, প্রতিটি এই কোচিং সেন্টারেই।

৩ · সমস্যা ১ — একই ডেটার অনেক কপি, আর কপিগুলোর অমিল

রাফির ফোন নম্বর তিনটি ফাইলে আছে। একই তথ্যের একাধিক জায়গায় থাকাকে বলে data redundancy (ডেটার পুনরাবৃত্তি)। শুধু জায়গা নষ্ট হলে সমস্যা ছোট ছিল। বড় সমস্যা হয় যখন কপিগুলো বদলাতে গিয়ে একটি বদলায়, বাকিগুলো বদলায় না — তখন একই প্রশ্নের দুটি ভিন্ন উত্তর পাওয়া যায়। একে বলে data inconsistency (অসংগতি)। নিচের ডায়াগ্রামে ধাপে ধাপে দেখুন:

তিন অফিসের ফাইলে রোল 101সবুজ = এই ধাপে বদলানো বা ব্যবহৃত

            
প্রতিটি ধাপের পর
ফোনের কপি
ভিন্ন মান
অবস্থা
  1. তিন কপি, এক মান। ভর্তির সময় একই ফোন নম্বর তিন অফিসে তিনবার টাইপ হয়েছে। এটি redundancy — কিন্তু এখনো তিনটি মান মিলে আছে, তাই আপাতত কোনো ক্ষতি নেই।
  2. রাফি নম্বর বদলাল। পুরোনো সিম হারিয়ে রাফি নতুন নম্বর নিল, আর admit card নিতে গিয়ে পরীক্ষা অফিসকে জানাল। শুধু exam.csv বদলাল। বাকি দুই অফিস খবরই পেল না।
  3. ক্ষতি শুরু। মাসের ১০ তারিখে হিসাব অফিসের প্রোগ্রাম নিজের ফাইল থেকে নম্বর নিয়ে “ফি বাকি” SMS পাঠাল — পুরোনো, বন্ধ নম্বরে। রাফির পরিবার কিছুই জানল না, মাস শেষে জরিমানা যোগ হলো।
  4. কোনটি সত্য? অভিভাবক অভিযোগ নিয়ে এলেন। পরিচালক তিনটি ফাইল খুললেন — দুটি বলছে 0171…, একটি বলছে 0179…. সংখ্যাগরিষ্ঠ মানটিই এখানে ভুল! কোন কপি সর্বশেষ, তা ফাইল দেখে বোঝার কোনো উপায় নেই। এটাই inconsistency.
  5. DBMS-এর পথ। ফোন নম্বর থাকে একটিমাত্র টেবিলের একটিমাত্র সারিতে। তিন অফিসের প্রোগ্রাম আলাদা ফাইল রাখে না, একই সারি পড়ে। বদল একবার, আর সেই মুহূর্ত থেকে সবাই নতুন নম্বর দেখে। কপি নেই, তাই অমিলেরও সুযোগ নেই।

এবার নিজের হাতে অমিল খুঁজে দেখুন। ধরুন ভর্তি অফিস আর পরীক্ষা অফিসের ফাইল দুটিকে আমরা দুটি টেবিলে তুলে আনলাম: admission_file আর exam_file, দুটোতেই তিনটি কলাম — roll (রোল), name (নাম), phone (ফোন)। নিচের কোয়েরি প্রতিটি রোল দুই টেবিলে মিলিয়ে দেখায় কোথায় নাম বা ফোন আলাদা। কোয়েরির খুঁটিনাটি (JOIN) পর্ব ১৯-এ শিখবেন; এখন শুধু ফলাফলটি দেখুন।

-- দুই অফিসের কপি মিলিয়ে অমিল খোঁজা
SELECT a.roll,
       a.name  AS admission_name,
       e.name  AS exam_name,
       a.phone AS admission_phone,
       e.phone AS exam_phone
FROM admission_file a
JOIN exam_file e ON a.roll = e.roll
WHERE a.phone <> e.phone OR a.name <> e.name;

ফলাফলে দুটি সারি আসে: রোল 101 — দুই নামই Rafi Ahmed, কিন্তু ফোন 01711111111 বনাম 01799999999; আর রোল 102 — ফোন একই 01822222222, কিন্তু নাম Mim Akter বনাম Mim Akhter. রোল 103 আসেনি, কারণ দুই কপি হুবহু মেলে। <> মানে “সমান নয়”। মাত্র তিনজন শিক্ষার্থীর মধ্যে দুজনের তথ্য অমিল — ছয়শো জনে কত হবে ভাবুন। আর খেয়াল করুন: কোয়েরি অমিল খুঁজে দিতে পারে, কিন্তু কোনটি ঠিক তা বলতে পারে না। সমাধান অমিল খোঁজা নয়, কপিই না রাখা।

Redundancy সবসময় খারাপ নয়। Backup, replication (পর্ব ৫২), বা দ্রুত পড়ার জন্য ইচ্ছাকৃত denormalization (পর্ব ৩৮) — এগুলোও কপি। পার্থক্য হলো, সেখানে কপিগুলো DBMS নিজে নিয়ন্ত্রণ করে এবং মিলিয়ে রাখে। ফাইল সিস্টেমে কপিগুলো অনিয়ন্ত্রিত — কেউ জানেই না কয়টি কপি আছে।

৪ · সমস্যা ২, ৩ ও ৪ — নতুন প্রশ্ন, ভিন্ন ফরম্যাট, লুকানো নিয়ম

সমস্যা ২ · ডেটা পাওয়া কঠিন — প্রতিটি নতুন প্রশ্নে নতুন প্রোগ্রাম

এক সোমবার পরিচালক জানতে চাইলেন, “যাদের দুই মাসের ফি বাকি, অথচ mock পরীক্ষায় ৮০-র বেশি পেয়েছে, তাদের তালিকা দিন — বৃত্তির কথা ভাবছি।” ডেটা সবই আছে, কিন্তু কোনো প্রোগ্রাম এই প্রশ্নের উত্তর দেয় না। হিসাবের প্রোগ্রাম শুধু ফি-র রিপোর্ট ছাপে, পরীক্ষার প্রোগ্রাম শুধু মেধাতালিকা। প্রোগ্রামার বন্ধুকে ফোন করা হলো; তিনি বললেন, “বৃহস্পতিবার নাগাদ লিখে দেব।” তাঁকে যা লিখতে হবে, তার কাঠামো মোটামুটি এরকম:

// ফাইল-ভিত্তিক ব্যবস্থায় একটি নতুন প্রশ্নের প্রোগ্রাম
open "accounts.txt"
for each line:
    roll   = line[0..3]          // প্রথম ৪ অক্ষর
    due    = line[35..40]        // ঘরের অবস্থান জানতে হবে
    if due >= 2 months fee: remember roll in DUE_LIST
open "exam.csv"
for each line:
    split by ","                 // ভিন্ন ফরম্যাট, ভিন্ন নিয়ম
    if roll in DUE_LIST and max(mock1, mock2) > 80:
        print roll, name

পরের সপ্তাহে প্রশ্ন একটু বদলাল — “শুধু উপশহরের শিক্ষার্থীদের মধ্যে।” এবার ঠিকানা আছে তৃতীয় ফাইলে, তাই আবার নতুন প্রোগ্রাম। ফাইল-ভিত্তিক ব্যবস্থায় প্রতিটি নতুন প্রশ্ন মানে একটি নতুন প্রোগ্রাম, আর প্রতিটি প্রোগ্রামে নতুন বাগের সুযোগ। পূর্বপরিকল্পনা ছাড়া হঠাৎ করা প্রশ্নকে বলে ad-hoc query; বাস্তবে ব্যবসার বেশিরভাগ প্রশ্নই এমন।

সমস্যা ৩ · ডেটা বিচ্ছিন্ন — ভিন্ন ভিন্ন ফরম্যাট

উপরের প্রোগ্রামে খেয়াল করুন — একটি ফাইল পড়তে হচ্ছে অক্ষরের অবস্থান গুনে, আরেকটি কমা ধরে ভেঙে, তৃতীয়টি Excel-এর নিজস্ব ফরম্যাটে। ডেটা ছড়িয়ে আছে আলাদা আলাদা ফাইলে, আলাদা ফরম্যাটে, কখনো আলাদা কম্পিউটারে। একে বলে data isolation. রোল নম্বরও এক রকম নয় — হিসাবের ফাইলে 0101, বাকি দুটিতে 101; মেলাতে গেলে আগে রূপান্তর করতে হবে। নামের বানান আলাদা হলে নাম দিয়ে মেলানো অসম্ভব।

সমস্যা ৪ · Integrity-র সমস্যা — নিয়মগুলো কোডের ভেতরে লুকানো

কোচিং সেন্টারের কিছু নিয়ম আছে: মাসিক ফি শূন্য বা ঋণাত্মক হতে পারবে না; পরীক্ষার নম্বর ০ থেকে ১০০-র মধ্যে; যে রোল ভর্তি অফিসে নেই, তার নামে ফি জমা নেওয়া যাবে না। এ ধরনের নিয়মকে বলে integrity constraint — ডেটা “সঠিক” থাকার শর্ত।

ফাইল-ভিত্তিক ব্যবস্থায় এই নিয়ম কোথায় থাকে? প্রতিটি প্রোগ্রামের ভেতরে, if হিসেবে। হিসাবের প্রোগ্রামে হয়তো ফি যাচাই আছে, কিন্তু যিনি Excel-এ সরাসরি ফি বদলান, তাঁকে কেউ আটকায় না। নতুন একটি নিয়ম এলে (“ফি কমপক্ষে ৫০০ টাকা”) সব প্রোগ্রাম খুঁজে খুঁজে বদলাতে হয় — একটি বাদ পড়লেই ভুল ডেটা ঢুকে যায়। আর পাঁচ বছর পর কেউ জানবেই না কোন নিয়ম কোন প্রোগ্রামে লেখা ছিল।

ধরুন একটি ভবনে নিয়ম — “১৮ বছরের নিচে কেউ জিমে ঢুকবে না।” ফাইল সিস্টেমের পদ্ধতি হলো প্রতিটি দরজার দারোয়ানকে আলাদা করে মুখে বলে দেওয়া; নতুন দারোয়ান এলে কেউ বলতে ভুলে যায়, আর পেছনের দরজায় দারোয়ানই নেই। DBMS-এর পদ্ধতি হলো জিমের নিজের দরজায় একটি কার্ড-রিডার বসানো — কে কোন পথে এলেন তাতে কিছু যায় আসে না, নিয়ম দরজাতেই লেখা।

৫ · সমস্যা ৫, ৬ ও ৭ — অর্ধেক কাজ, একসাথে দুজন, আর নিরাপত্তা

সমস্যা ৫ · Atomicity-র সমস্যা — কাজ অর্ধেক হয়ে থেমে গেলে

কিছু কাজ আছে যা হয় পুরোটা হবে, নয়তো একটুও হবে না — মাঝামাঝি কোনো অবস্থা গ্রহণযোগ্য নয়। এই গুণের নাম atomicity. সবচেয়ে পরিচিত উদাহরণ টাকা পাঠানো: করিমের হিসাব থেকে ৫০০০ টাকা কাটা আর সেলিনার হিসাবে ৫০০০ টাকা যোগ — দুটি আলাদা লেখা, কিন্তু একসাথে একটি কাজ। কোচিং সেন্টারের হিসাব অফিসে ধরুন এমন দুটি হিসাব ফাইলে রাখা আছে। এবার দেখুন লোডশেডিং ঠিক ভুল মুহূর্তে এলে কী হয়:

1// transfer: Karim -> Selina, 50002a = read("karim.dat")3a = a - 50004write("karim.dat", a)5b = read("selina.dat")6b = b + 50007write("selina.dat", b)
ডিস্কে আর মেমরিতে
karim.dat
selina.dat
মেমরিতে a
ডিস্কে মোট টাকা
  1. শুরু। ডিস্কে করিমের 10000, সেলিনার 2000 — মোট 12000 টাকা। সবুজ লাইন ২ এখনো চলেনি, পরের ধাপে চলবে।
  2. লাইন ২ চলল। করিমের ব্যালান্স ফাইল থেকে মেমরিতে এলো: a = 10000. ডিস্কে কিছু বদলায়নি।
  3. লাইন ৩ চলল। মেমরিতে a = 5000. এখনো শুধু মেমরিতে — বিদ্যুৎ গেলে এই হিসাব মুছে যাবে, কিন্তু ডিস্ক অক্ষত থাকবে।
  4. লাইন ৪ চলল — বিপদের শুরু। ডিস্কে করিমের ফাইলে 5000 লেখা হয়ে গেল। সেলিনা এখনো টাকা পাননি। এই মুহূর্তে ডিস্কে মোট 7000 — ডেটা একটি “অর্ধেক” অবস্থায় আছে।
  5. লোডশেডিং! লাইন ৫ চলার আগেই বিদ্যুৎ চলে গেল, প্রোগ্রাম মারা গেল। মেমরির a হারিয়ে গেল। লাইন ৫–৭ আর কখনো চলবে না।
  6. কম্পিউটার আবার চালু হলো। ডিস্কে করিম 5000, সেলিনা 2000 — মোট 7000. ৫০০০ টাকা উধাও। আর সবচেয়ে খারাপ খবর: কোথাও লেখা নেই যে একটি transfer অর্ধেক হয়ে আছে। কেউ খেয়াল না করা পর্যন্ত ভুলটি থেকে যাবে।
  7. DBMS-এর পথ। DBMS দুটি লেখাকে একটি transaction হিসেবে দেখে, আর ডেটা বদলানোর আগে একটি log-এ লিখে রাখে “T1 শুরু, karim-এর আগের মান 10000”. আবার চালু হয়ে DBMS log পড়ে দেখে T1 শেষ (commit) হয়নি, তাই তার অর্ধেক কাজ ফিরিয়ে নেয় (undo): করিম আবার 10000, মোট 12000. হয় পুরো transfer, নয়তো কিছুই না।

আরও গভীরে: উপরের “আগে log, পরে ডেটা” নিয়মের নাম write-ahead logging (WAL). DBMS ডেটার page ডিস্কে লেখার আগে সেই বদলের log রেকর্ড ডিস্কে নিশ্চিতভাবে লেখে, তাই crash-এর পর log দেখে অসমাপ্ত transaction undo আর commit হওয়া transaction redo করা যায়। IBM-এর C. Mohan ও সহকর্মীরা ১৯৯২ সালে এই পদ্ধতির একটি পূর্ণাঙ্গ রূপ ARIES প্রকাশ করেন, যার ধারণা আজ বহু বাণিজ্যিক ডেটাবেসে ব্যবহৃত হয়। SQLite এই কাজটি rollback journal বা WAL ফাইল দিয়ে করে — বিস্তারিত পর্ব ৪৮-এ।

সমস্যা ৬ · একসাথে দুজন — concurrent access-এর গোলমাল

কোচিং সেন্টারে দুটি কাউন্টার। রাফির অভিভাবক ১ নম্বর কাউন্টারে অগ্রিম ৩০০০ টাকা জমা দিলেন, আর ঠিক একই সময়ে ২ নম্বর কাউন্টারে ক্লার্ক রাফির অগ্রিম থেকে ২০০০ টাকা মাসিক ফি কাটলেন। শুরুতে অগ্রিম ছিল ১০০০০, তাই সঠিক ফল ১০০০০ + ৩০০০ − ২০০০ = ১১০০০. দুজনের প্রোগ্রামই একই ফাইল পড়ে আর লেখে, কেউ কারও কথা জানে না। একাধিক জনের একই ডেটায় একসাথে কাজ করাকে বলে concurrent access, আর তাদের সমন্বয়ের ব্যবস্থাকে বলে concurrency control. সমন্বয় না থাকলে কী হয় দেখুন:

সময়রেখাসবুজ = এই ধাপে ঘটল

            
প্রতিটি ধাপের পর
Clerk-1-এর মেমরিতে
Clerk-2-এর মেমরিতে
ফাইলে ব্যালান্স
সঠিক হওয়া উচিত
  1. শুরু। ফাইলে রাফির অগ্রিম 10000 টাকা। দুই কাউন্টারে দুজন ক্লার্ক প্রায় একই মুহূর্তে কাজ শুরু করবেন।
  2. t2 — Clerk-1 পড়লেন। জমা নেওয়ার জন্য ১ নম্বর কাউন্টারের প্রোগ্রাম ফাইল থেকে 10000 পড়ে নিজের মেমরিতে রাখল।
  3. t3 — Clerk-2-ও পড়লেন। Clerk-1 তখনো লেখেননি, তাই ২ নম্বর কাউন্টারও পড়ল সেই পুরোনো 10000. এখন দুজনের হাতে একই পুরোনো মান — বিপদ এখানেই তৈরি হলো।
  4. t4 — Clerk-1 লিখলেন। 10000 + 3000 = 13000 ফাইলে লেখা হলো। এ পর্যন্ত ঠিক আছে।
  5. t5 — Clerk-2 লিখলেন, আর জমাটি হারাল। Clerk-2 নিজের হাতের পুরোনো 10000 থেকে হিসাব করলেন: 10000 − 2000 = 8000, আর সেটি লিখে দিলেন — Clerk-1-এর লেখা 13000 মুছে গেল। ফাইলে 8000, অথচ হওয়ার কথা 11000. অভিভাবকের ৩০০০ টাকার জমা কোথাও নেই। এর নাম lost update.
  6. DBMS-এর পথ — lock. DBMS-এ Clerk-1 সারিটি পড়ার আগে একটি lock নেন। Clerk-2 lock চাইলে তাঁকে অপেক্ষা করতে হয় (t3). Clerk-1 লিখে lock ছাড়লে Clerk-2 পড়েন নতুন মান 13000, আর লেখেন 11000 — সঠিক। দুজনের কাজ এমনভাবে সাজানো হলো যেন একজনের পর আরেকজন করেছেন।

এই উদাহরণে মাত্র দুটি কাউন্টার। কিন্তু ট্রেনের টিকিট বুকিং বা bKash-এর মতো ব্যবস্থায় একই মুহূর্তে হাজার হাজার মানুষ একই ডেটায় হাত দেন — শেষ সিটটি দুজনকে বিক্রি হয়ে যাওয়া, বা একই টাকা দুবার খরচ হয়ে যাওয়া ঠিক এই ধরনের সমস্যা। Transaction, lock, schedule আর isolation level নিয়ে পুরো মডিউল ৭ আছে — বিশেষ করে পর্ব ৪৫ থেকে ৪৭.

সমস্যা ৭ · নিরাপত্তার সমস্যা — হয় পুরো ফাইল, নয়তো কিছুই না

পরীক্ষা অফিসের ক্লার্কের শুধু নাম আর নম্বর দেখার কথা, অভিভাবকের ফোন বা ফি নয়। কিন্তু অপারেটিং সিস্টেম অনুমতি দেয় পুরো ফাইলের ওপর — হয় ফাইলটি খুলতে পারবেন, নয়তো পারবেন না। “এই কলামগুলো দেখতে পারবেন, ওই কলাম নয়” বা “শুধু নিজের শাখার শিক্ষার্থী” বলার উপায় নেই। ফলে বাস্তবে সবাই সব ফাইলের কপি নিয়ে ঘোরেন — পেনড্রাইভে, ইমেইলে, মেসেঞ্জারে। কে কখন কী দেখল বা বদলাল, তার কোনো হিসাবও থাকে না।

৬ · DBMS কীভাবে প্রতিটি সমস্যার সমাধান করে

DBMS জাদু নয় — প্রতিটি সমস্যার জন্য একটি নির্দিষ্ট বৈশিষ্ট্য আছে। পুরো ছবিটি এক টেবিলে:

ফাইল-ভিত্তিক সমস্যাDBMS-এর বৈশিষ্ট্যকোথায় বিস্তারিত
Redundancy ও inconsistencyএক জায়গায় ডেটা, সব প্রোগ্রাম একই টেবিল পড়ে; normalization দিয়ে কপি কমানোপর্ব ৩৬–৩৭
নতুন প্রশ্নে নতুন প্রোগ্রামDeclarative query language — SQL; কী চাই বললেই হয়, কীভাবে খুঁজবে DBMS ঠিক করেমডিউল ৩
Data isolation (ভিন্ন ফরম্যাট)একটি schema, একই data type, একই key দিয়ে টেবিলগুলো যুক্তপর্ব ০৫, ১৩
কোডে লুকানো নিয়মConstraint — NOT NULL, UNIQUE, CHECK, foreign key — ডেটাবেসেই লেখাপর্ব ০৬, ১৩, ২৩
অর্ধেক কাজ (atomicity)Transaction, rollback, log ও recoveryপর্ব ৪৪, ৪৮
Concurrent access-এর গোলমালConcurrency control — lock, MVCC, isolation levelপর্ব ৪৫–৪৭
নিরাপত্তাAccess control — user, role, GRANT, view; audit logপর্ব ২৪, ৫১

এবার এগুলো নিজের চোখে দেখুন। নিচের সব editor-এ একটি ছোট অনলাইন দোকানের নমুনা ডেটাবেস লোড হয় (পুরো কোর্সে এটিই ব্যবহার হবে)। এখানে আমাদের লাগবে দুটি টেবিল: customers — গ্রাহক (customer_id, name, city, phone, joined_on); আর products — পণ্য (product_id, name, category_id, price টাকায়, stock মজুত)। এ ছাড়া আছে orders (অর্ডার: কোন গ্রাহক, কোন তারিখ, অবস্থা) আর order_items (কোন অর্ডারে কোন পণ্য কতটি, কত দামে)। প্রতিটি editor-এর নিচে “নমুনা ডেটাবেস” খুলে সব সারি দেখতে পারবেন। কোড বদলালে ফলও সাথে সাথে বদলায়।

এক জায়গায় বদল — সবাই দেখে নতুন মান

গ্রাহক Rahim Uddin (customer_id 1) ঢাকা থেকে গাজীপুরে চলে গেছেন। তাঁর তিনটি অর্ডার আছে। ফাইল-ভিত্তিক ব্যবস্থায় হয়তো প্রতিটি অর্ডারের রেকর্ডে ঠিকানা কপি করা থাকত। এখানে শহর আছে শুধু customers টেবিলে, আর অর্ডারগুলো শুধু customer_id দিয়ে গ্রাহককে চেনে। একবার বদলান:

-- শহর বদলানো হলো একটিমাত্র সারিতে
UPDATE customers SET city = 'Gazipur' WHERE customer_id = 1;

-- এবার Rahim-এর সব অর্ডারের সাথে শহর দেখি
SELECT o.order_id, o.order_date, c.name, c.city
FROM orders o
JOIN customers c ON c.customer_id = o.customer_id
WHERE o.customer_id = 1;

UPDATE-এর পর বার্তা আসে: “১টি সারি বদলেছে”. তারপর SELECT তিনটি সারি দেখায় — 1001 · 2025-09-01, 1003 · 2025-09-10 আর 1009 · 2025-10-08, প্রতিটিতে Rahim Uddin আর Gazipur. একটি বদলেই তিনটি অর্ডার নতুন শহর দেখাচ্ছে, কারণ শহরটি তিনবার লেখা নেই — অর্ডারগুলো প্রতিবার customers টেবিল থেকে শহর “ধার করে” আনে। চেষ্টা করুন: WHERE লাইনটি মুছে UPDATE চালালে কী হয় দেখুন — সব ৮ জন গ্রাহকের শহর বদলে যাবে (“৮টি সারি বদলেছে”). পর্ব ১৪-এ এই ভুল থেকে বাঁচার অভ্যাস শিখবেন।

নিয়ম ডেটাবেসে লেখা — ভুল ডেটা ঢোকেই না

নমুনা ডেটাবেসের products টেবিল তৈরির সময় লেখা হয়েছিল CHECK (price > 0) — দাম শূন্যের বেশি হতেই হবে। এবার কেউ ভুল করে শূন্য দামের একটি পণ্য ঢোকানোর চেষ্টা করছে। এই কোডটি ইচ্ছে করে error দেখানোর জন্য:

-- দাম 0 — নিয়ম ভাঙছে
INSERT INTO products (product_id, name, category_id, price, stock)
VALUES (111, 'Free Pen', 2, 0, 50);

SQLite উত্তর দেয়: CHECK constraint failed: price > 0, আর সারিটি ঢোকে না। কোন প্রোগ্রাম থেকে, কোন অফিস থেকে, বা সরাসরি কেউ SQL লিখে ঢোকানোর চেষ্টা করছেন — তাতে কিছু যায় আসে না; নিয়মটি ডেটার পাশেই পাহারা দিচ্ছে, ঠিক জিমের দরজার কার্ড-রিডারের মতো। চেষ্টা করুন: 0-এর জায়গায় 25 লিখে চালান — এবার “১টি সারি বদলেছে”.

শুধু একটি টেবিলের ভেতরের নিয়ম নয়, টেবিলের মধ্যের সম্পর্কও DBMS পাহারা দেয়। orders টেবিলের customer_id একটি foreign key — যে গ্রাহক নেই, তাঁর নামে অর্ডার হতে পারে না। নমুনা ডেটায় গ্রাহক মাত্র ৮ জন; ৯৯ নম্বর গ্রাহকের নামে অর্ডার ঢোকানোর চেষ্টা দেখুন (এটিও ইচ্ছাকৃত error):

-- 99 নম্বর গ্রাহক নেই
INSERT INTO orders (order_id, customer_id, order_date, status)
VALUES (1011, 99, '2025-10-20', 'pending');

ফল: FOREIGN KEY constraint failed. কোচিং সেন্টারের “ভর্তি অফিসে নেই এমন রোলের ফি নেওয়া যাবে না” নিয়মটি ঠিক এই জিনিস। একটি সতর্কতা: SQLite-এ foreign key যাচাই ডিফল্টভাবে বন্ধ থাকে, প্রতিটি connection-এ PRAGMA foreign_keys = ON দিয়ে চালু করতে হয় — এই পাতার editor নিজে থেকেই চালু করে রাখে। PostgreSQL, MySQL-এর InnoDB, SQL Server বা Oracle-এ foreign key ডিফল্টভাবেই যাচাই হয় (বিশেষ সেটিং দিয়ে সাময়িক বন্ধ করা গেলেও)। চেষ্টা করুন: 99-কে 5 করে দিন — এবার অর্ডারটি ঢুকবে।

নতুন প্রশ্ন — নতুন প্রোগ্রাম ছাড়াই

মনে আছে পরিচালকের প্রশ্নে প্রোগ্রামারের লেগেছিল তিন দিন? দোকানের মালিক হঠাৎ জানতে চাইলেন, “ঢাকার গ্রাহকদের নাম আর ফোন নম্বর দিন।” SQL-এ এটি একটি বাক্য:

SELECT name, phone
FROM customers
WHERE city = 'Dhaka';

তিনটি সারি: Rahim Uddin · 01711000001, Sabbir Hasan · 01911000003, Mitu Rani · 01411000008. আপনি বলেছেন কী চান — কোন কলাম, কোন টেবিল, কোন শর্ত। কীভাবে খুঁজবে — কোন ক্রমে ফাইল পড়বে, কোন index ব্যবহার করবে — সেটি DBMS নিজে ঠিক করে। এই ধরনের ভাষাকে বলে declarative. চেষ্টা করুন: 'Dhaka'-কে 'Sylhet' করুন — নতুন প্রশ্ন, নতুন উত্তর, প্রোগ্রাম একটিও লিখতে হলো না।

এবার একটু কঠিন প্রশ্ন, যেটি ফাইল-ভিত্তিক ব্যবস্থায় তিনটি ফাইল মিলিয়ে লিখতে হতো: “বাতিল (cancelled) অর্ডার বাদ দিয়ে, কোন শহর থেকে কয়টি অর্ডার আর মোট কত টাকার বিক্রি?” কোয়েরির গঠন এখনই বোঝার দরকার নেই (GROUP BY আসবে পর্ব ১৮-এ) — শুধু দেখুন, পাঁচ লাইনে উত্তর:

SELECT c.city,
       COUNT(DISTINCT o.order_id)        AS orders,
       SUM(oi.quantity * oi.unit_price)  AS total_taka
FROM customers c
JOIN orders o       ON o.customer_id = c.customer_id
JOIN order_items oi ON oi.order_id   = o.order_id
WHERE o.status <> 'cancelled'
GROUP BY c.city
ORDER BY total_taka DESC;

ফল পাঁচটি সারি: Dhaka · 4 · 37730, Rajshahi · 1 · 5050, Chattogram · 2 · 5000, Sylhet · 1 · 3500, আর শেষে শহরের ঘর ফাঁকা (NULL) — 1 · 1040. শেষ সারিটি Imran Hossain-এর, যাঁর শহর জানা নেই; DBMS তাঁকে বাদ দেয়নি, “অজানা শহর” দলে রেখেছে। ঢাকার হিসাবে Sabbir-এর বাতিল অর্ডার (4500 টাকার শাড়ি) ধরা হয়নি। Khulna নেই, কারণ Tanvir কোনো অর্ডারই করেননি। এই ছোট ছোট সূক্ষ্মতা (NULL, বাদ পড়া সারি) হাতে লেখা প্রোগ্রামে প্রায়ই ভুল হয় — পর্ব ১৬ ও ১৯-এ বিস্তারিত।

Transaction — অর্ধেক কাজ ফিরিয়ে নেওয়া

টাকা পাঠানোর stepper-এ দেখেছিলেন, DBMS অসমাপ্ত কাজ ফিরিয়ে নিতে পারে। নিজে চেষ্টা করুন: একটি transaction শুরু (BEGIN), হেডফোনের মজুত ২টি কমানো, দেখা, তারপর ROLLBACK দিয়ে বাতিল করা:

BEGIN;
UPDATE products SET stock = stock - 2 WHERE product_id = 102;
SELECT product_id, name, stock FROM products WHERE product_id = 102;

ROLLBACK;   -- পুরো transaction বাতিল
SELECT product_id, name, stock FROM products WHERE product_id = 102;

প্রথম SELECT দেখায় 102 · Headphone · 38 — transaction-এর ভেতরে মজুত কমেছে। ROLLBACK-এর পর দ্বিতীয় SELECT দেখায় 102 · Headphone · 40 — যেন কিছুই ঘটেনি। crash হলে recovery ঠিক এই কাজটিই নিজে থেকে করে: commit না হওয়া সব transaction-এর জন্য একটি অদৃশ্য ROLLBACK. চেষ্টা করুন: ROLLBACK-কে COMMIT করে দিন — এবার দুটি SELECT-ই 38 দেখাবে, কারণ বদলটি স্থায়ী হয়েছে।

নিরাপত্তা — কে কোন কলাম দেখবেন

SQLite একটি ফাইলেই চলে, তাই এতে user বা অনুমতির ব্যবস্থা নেই (অনুমতি নির্ভর করে ফাইলের ওপর)। PostgreSQL বা MySQL-এর মতো server DBMS-এ পরীক্ষা অফিসকে শুধু নির্দিষ্ট কলাম দেখানো যায়। নিচের কোডটি এই পাতায় চলবে না — শুধু দেখার জন্য:

CREATE ROLE exam_office LOGIN PASSWORD '...';
-- শুধু রোল, নাম আর নম্বর দেখতে পারবে; ফোন বা ফি নয়
GRANT SELECT (roll, name, mock1, mock2) ON students TO exam_office;
-- নম্বর বদলাতে পারবে, কিন্তু অন্য কিছু নয়
GRANT UPDATE (mock1, mock2) ON students TO exam_office;

এখন exam_office হিসেবে কেউ SELECT phone FROM students চালালে PostgreSQL “permission denied” বলবে। ফাইলের পুরো-অথবা-কিছুই-না অনুমতির তুলনায় এটি অনেক সূক্ষ্ম নিয়ন্ত্রণ। Role, privilege আর SQL injection প্রতিরোধ নিয়ে পর্ব ৫১.

পরীক্ষা ও ইন্টারভিউতে — এই পর্ব থেকে যে ধরনের প্রশ্ন প্রায়ই আসে:

  • File processing system-এর অসুবিধাগুলো লিখুন। → Redundancy ও inconsistency, ডেটা পাওয়া কঠিন, data isolation, integrity, atomicity, concurrent access আর security-র সমস্যা — প্রতিটির একটি উদাহরণসহ।
  • Data redundancy আর data inconsistency-র পার্থক্য কী? → Redundancy মানে একই ডেটার একাধিক কপি; inconsistency মানে সেই কপিগুলোর মান না মেলা। প্রথমটি দ্বিতীয়টির কারণ।
  • Lost update কী, DBMS কীভাবে ঠেকায়? → দুজন একই পুরোনো মান পড়ে লিখলে প্রথমজনের লেখা মুছে যায়; lock বা MVCC দিয়ে কাজগুলো এমনভাবে সাজানো হয় যেন একটির পর একটি ঘটেছে।
  • DBMS-এর দুটি অসুবিধা বলুন। → খরচ ও জটিলতা (সফটওয়্যার, হার্ডওয়্যার, দক্ষ লোক), আর ছোট সাধারণ কাজে গতির বাড়তি বোঝা।
  • Relational model কে, কবে প্রস্তাব করেন? → Edgar F. Codd, IBM, ১৯৭০ সালে “A Relational Model of Data for Large Shared Data Banks” প্রবন্ধে।

৭ · DBMS-এর দাম — কখন সাধারণ ফাইলই যথেষ্ট

এতক্ষণ শুনে মনে হতে পারে, সব ডেটা ডেটাবেসে রাখাই বুদ্ধিমানের কাজ। তা নয়। প্রতিটি সুবিধার একটি দাম আছে, আর ভালো ইঞ্জিনিয়ার দাম জেনে বেছে নেন।

✅ DBMS-এর সুবিধা

Redundancy কম ও নিয়ন্ত্রিত; ডেটা সংগত; ad-hoc প্রশ্নের দ্রুত উত্তর; নিয়ম এক জায়গায়; transaction ও crash recovery; বহু ব্যবহারকারী একসাথে; সূক্ষ্ম নিরাপত্তা; backup ও replication-এর সুব্যবস্থা; ডেটার গঠন বদলালেও প্রোগ্রাম কম বদলাতে হয় (data independence, পর্ব ০৩)।

ব্যাংক, ই-কমার্স, NID, বিশ্ববিদ্যালয়

⚠️ DBMS-এর দাম

জটিলতা: ইনস্টল, কনফিগার, ডিজাইন, টিউনিং শিখতে হয়। খরচ: বাণিজ্যিক লাইসেন্স (যেমন Oracle, SQL Server), সার্ভার, backup, দক্ষ DBA. বাড়তি বোঝা: প্রতিটি কোয়েরি parse, plan, log, lock — ছোট সাধারণ কাজে সরাসরি ফাইলের চেয়ে ধীর হতে পারে। একক ব্যর্থতার বিন্দু: সার্ভার বন্ধ হলে সব অ্যাপ বন্ধ।

PostgreSQL, MySQL ফ্রি — কিন্তু চালানো ফ্রি নয়

যেখানে সাধারণ ফাইলই ঠিক

  • Log ফাইল: ওয়েব সার্ভারের access log শুধু শেষে নতুন লাইন যোগ করে (append), কেউ পুরোনো লাইন বদলায় না, একসাথে একজনই লেখে। এখানে transaction বা lock-এর দরকার নেই, আর text ফাইল সবচেয়ে দ্রুত।
  • Configuration: অ্যাপের সেটিং — JSON, YAML বা .env ফাইল। মানুষ সহজে পড়ে, Git-এ পরিবর্তনের ইতিহাস থাকে।
  • ছোট এক-ব্যবহারকারীর অ্যাপ: নিজের খরচের হিসাব, একটি স্ক্রিপ্টের ফল — CSV বা JSON যথেষ্ট।
  • বড় মিডিয়া ফাইল: ছবি, ভিডিও, PDF সাধারণত ডিস্ক বা object storage-এ থাকে; ডেটাবেসে থাকে শুধু ফাইলের ঠিকানা আর বর্ণনা।
  • এককালীন ডেটা আদান-প্রদান: এক প্রতিষ্ঠান থেকে আরেক প্রতিষ্ঠানে রিপোর্ট পাঠাতে CSV এখনো সবচেয়ে সর্বজনীন।

মাঝামাঝি একটি পথও আছে — SQLite. এটি সার্ভার ছাড়াই একটি সাধারণ ফাইলের ভেতরে পুরো relational database রাখে, transaction আর constraint-সহ। SQLite-এর নিজস্ব ওয়েবসাইট বলে, SQLite client/server ডেটাবেসের সাথে প্রতিযোগিতা করে না, প্রতিযোগিতা করে fopen()-এর (ফাইল খোলার সাধারণ ফাংশন) সাথে। ফোনের অ্যাপ, ব্রাউজার, ছোট ডেস্কটপ সফটওয়্যারের ভেতরে প্রায়ই SQLite থাকে — আর এই কোর্সের প্রতিটি লাইভ editor-ও SQLite-এ চলে। Python থেকে SQLite ব্যবহার দেখতে চাইলে Python কোর্সের ডেটাবেস পর্ব দেখুন।

সিদ্ধান্তের প্রশ্ন

চারটি প্রশ্ন করুন: (১) একাধিক মানুষ বা প্রোগ্রাম কি একসাথে লিখবে? (২) ডেটার মধ্যে কি নিয়ম ও সম্পর্ক আছে, যা ভাঙলে ক্ষতি? (৩) আগে থেকে না-জানা প্রশ্ন কি করা হবে? (৪) অর্ধেক কাজ বা হারানো ডেটা কি টাকা বা আস্থার ক্ষতি করবে? একটির উত্তরও “হ্যাঁ” হলে DBMS ভাবুন। সবগুলো “না” হলে সাধারণ ফাইলই সম্ভবত সঠিক।

৮ · ইতিহাস — IMS আর IDS থেকে Codd

ডেটাবেসের জন্ম কোনো একজনের মাথা থেকে এক দিনে হয়নি। ফাইল-সমস্যায় জর্জরিত বড় প্রতিষ্ঠানগুলো ১৯৬০-এর দশকে নিজেরাই সমাধান খুঁজতে শুরু করে। ধাপে ধাপে দেখুন:

  1. পাঞ্চ কার্ড1890যন্ত্রে গণনা
  2. টেপ + COBOL1950s–60sফাইল আর batch
  3. IDSc. 1963–64Bachman, GE
  4. IMS1966–68IBM, Apollo
  5. CODASYL1969–71network মান
  6. Relational1970Codd, IBM
  1. ১৮৯০ — যন্ত্রে গণনা। যুক্তরাষ্ট্রের ১৮৯০ সালের আদমশুমারিতে Herman Hollerith-এর পাঞ্চ কার্ড যন্ত্র ব্যবহার হয় — প্রতিটি মানুষের তথ্য একটি কার্ডে ফুটো করে। পরে তাঁর কোম্পানি মিলেমিশে IBM হয়। ডেটা যন্ত্রে উঠল, কিন্তু “ডেটাবেস” তখনো নেই।
  2. ১৯৫০–৬০-এর দশক — টেপ, ফাইল আর COBOL. চৌম্বক টেপে master file, আর রাতে batch করে চলা প্রোগ্রাম। টেপ শুধু ক্রমানুসারে পড়া যায়, তাই সারাদিনের লেনদেন রোল বা হিসাব নম্বর ধরে সাজিয়ে পুরোনো master টেপের সাথে মিলিয়ে একটি নতুন master টেপ লেখা হতো। এই পর্বের সব সমস্যা এই যুগেরই।
  3. ১৯৬০-এর দশকের শুরু — IDS. General Electric-এ Charles Bachman তৈরি করেন Integrated Data Store (IDS) — ডিস্কে রাখা রেকর্ড, যেগুলো একে অপরের সাথে pointer দিয়ে যুক্ত। প্রোগ্রাম একটি রেকর্ড থেকে link ধরে আরেকটিতে “হেঁটে” যায়। এটিই পরে network model-এর ভিত্তি।
  4. ১৯৬৬–৬৮ — IMS আর Apollo. চাঁদে মানুষ পাঠানোর Apollo প্রকল্পে Saturn V রকেটের লক্ষ লক্ষ যন্ত্রাংশের হিসাব রাখতে IBM, North American Rockwell-এর সাথে মিলে ১৯৬৬ সালে কাজ শুরু করে; ১৯৬৮ সালে প্রথম সংস্করণ চালু হয়, পরে নাম হয় IMS (Information Management System). IMS-এ ডেটা গাছের মতো সাজানো — hierarchical model: রকেট → অংশ → উপ-অংশ।
  5. ১৯৬৯–৭১ — CODASYL. যে কমিটি COBOL বানিয়েছিল, সেই CODASYL-এর Data Base Task Group, Bachman-এর IDS-এর ধারণা থেকে একটি মান প্রকাশ করে — network model, যেখানে একটি রেকর্ডের একাধিক “মালিক” থাকতে পারে। ১৯৭৩ সালে Bachman ডেটাবেসে অবদানের জন্য Turing Award পান; তাঁর বক্তৃতার নাম ছিল “The Programmer as Navigator”.
  6. ১৯৭০ — Codd-এর relational model. IBM-এর গবেষক Edgar F. Codd প্রস্তাব করেন: pointer ধরে হাঁটা নয়, ডেটা থাকবে সাধারণ টেবিলে (relation), আর প্রোগ্রাম শুধু বলবে কী চাই — relational model. শুরুতে অনেকে ভাবতেন এটি বাস্তবে ধীর হবে; ১৯৭০-এর দশকে IBM-এর System R আর Berkeley-র Ingres প্রমাণ করে যে এটি চলে। ১৯৭৯ সালে Oracle প্রথম বাণিজ্যিক SQL ডেটাবেসগুলোর একটি বাজারে আনে, আর ১৯৮১ সালে Codd নিজেও Turing Award পান।

Bachman আর Codd-এর দৃষ্টিভঙ্গির পার্থক্য বোঝা খুব কাজের। Bachman-এর জগতে প্রোগ্রামার একজন “নাবিক” — তিনি জানেন কোন রেকর্ড থেকে কোন pointer ধরে কোথায় যেতে হবে। Codd বললেন, পথ খোঁজার কাজ প্রোগ্রামারের নয়, সিস্টেমের। ১৯৭৪ সালে ACM-এর একটি সম্মেলনে দুজনের মধ্যে প্রকাশ্য বিতর্ক হয়, যা ডেটাবেসের ইতিহাসে “The Great Debate” নামে পরিচিত। শেষ পর্যন্ত relational পথই মূলধারা হয়, কিন্তু IMS আজও IBM mainframe-এ চলে, আর hierarchical ও network ধারণা আজকের XML, JSON আর graph database-এ নতুন রূপে ফিরে এসেছে — পর্ব ০৪-এ বিস্তারিত।

৯ · আজকের “ফাইল সিস্টেম” — spreadsheet-এর ফাঁদ

আপনি হয়তো ভাবছেন, এসব তো ষাটের দশকের গল্প। কিন্তু আজকের যেকোনো অফিসে ঘুরে আসুন — বেতনের শিট, স্টকের শিট, ভর্তির শিট, প্রতিটি বিভাগের নিজের Excel বা Google Sheets. “final_v2_updated_REAL.xlsx” নামের ফাইল ইমেইলে ঘুরছে। এটি হুবহু আলোকিত কোচিংয়ের তিন ফাইলের গল্প। Spreadsheet চমৎকার টুল — হিসাব, চার্ট, দ্রুত বিশ্লেষণে অতুলনীয়। কিন্তু বহু মানুষের ভাগ করা, নিয়মে বাঁধা, দীর্ঘদিনের ডেটা রাখার জন্য এটি তৈরি হয়নি।

পুরোনো ফাইল-সমস্যাSpreadsheet-এ যেভাবে দেখা দেয়
Redundancy ও inconsistencyএকই শিটের পাঁচটি কপি, পাঁচজনের কম্পিউটারে, পাঁচ রকম মান
Integrityনম্বরের ঘরে লেখা, তারিখের তিন রকম ফরম্যাট; কিছু মান নিজে থেকে তারিখে বদলে যাওয়া
Atomicityকপি-পেস্ট মাঝপথে থামলে বা একটি সারি বাদ পড়লে কেউ টের পায় না
Concurrent accessদুজন একই ফাইলের দুটি কপিতে কাজ করে শেষে কোনটি রাখবেন বুঝতে পারেন না
আকারের সীমাএকটি Excel শিটে সর্বোচ্চ ১০,৪৮,৫৭৬টি সারি; পুরোনো .xls ফরম্যাটে মাত্র ৬৫,৫৩৬টি

এগুলো কাল্পনিক ঝুঁকি নয়। ২০২০ সালের অক্টোবরে যুক্তরাজ্যে প্রায় ১৬ হাজার পজিটিভ কোভিড টেস্টের ফল সময়মতো contact tracing-এ পৌঁছায়নি, কারণ ফলগুলো পুরোনো .xls ফরম্যাটের একটি ফাইলে আনা হচ্ছিল, যার সারির সীমা পেরিয়ে যাওয়া অংশ নীরবে বাদ পড়ে। জিনবিজ্ঞানে Excel বহু বছর ধরে SEPT1, MARCH1-এর মতো জিনের নাম তারিখে বদলে দিত; শেষে ২০২০ সালে বিজ্ঞানীরা কয়েকটি জিনের নামই বদলে ফেলেন (যেমন SEPTIN1, MARCHF1). দুটি ঘটনাই একই শিক্ষা দেয়: ডেটা রাখার টুল যদি নিয়ম না জানে, ভুল নীরবে ঢোকে।

বাংলাদেশের অনেক প্রতিষ্ঠানেই শিক্ষার্থী, কর্মী বা গ্রাহকের তথ্য Excel শিটে থাকে, আর সেই শিট পেনড্রাইভ বা মেসেঞ্জারে ঘোরে। এতে শুধু ভুলের ঝুঁকি নয়, ব্যক্তিগত তথ্য ফাঁসের ঝুঁকিও আছে — শিটে কোনো access control নেই, কে কপি নিল তার হিসাব নেই। শিট বড় হলে, একাধিক মানুষ লিখলে, বা তথ্য সংবেদনশীল হলে একটি সত্যিকারের ডেটাবেসে (দরকার হলে ওপরে একটি সহজ ফর্ম বা অ্যাপ বসিয়ে) সরানোর সময় এসেছে।

১০ · AI-এর যুগে — ফাইল না ডেটাবেস, আর AI-এর SQL যাচাই

আজ অনেকে AI-কে বলেন, “আমার দোকানের জন্য একটা হিসাবের প্রোগ্রাম বানিয়ে দাও।” AI প্রায়ই দ্রুততম পথটি বেছে নেয় — একটি CSV বা JSON ফাইলে সব রাখা। ছোট কাজে সেটি ঠিক; কিন্তু দুজন কর্মচারী একসাথে ব্যবহার শুরু করলেই এই পর্বের lost update আর inconsistency ফিরে আসে। AI নিজে থেকে প্রশ্ন করে না “কতজন একসাথে লিখবেন?” — প্রশ্নটি আপনাকেই তুলতে হবে।

আবার AI ডেটাবেস ব্যবহার করলেও তার SQL প্রায়ই চলে, কিন্তু ভুল: NULL ভুলভাবে সামলায় (যেমন উপরের শহরহীন Imran বাদ পড়ে যায়), JOIN-এ সারি দ্বিগুণ হয়ে যোগফল ফুলে ওঠে, এমন কলামের নাম বানায় যা আপনার টেবিলে নেই, constraint আর transaction ভুলে যায়, index-এর কথা ভাবে না।

ডিজাইনের আগে AI-কে প্রেক্ষাপট দিন এবং সিদ্ধান্তের কারণ জিজ্ঞেস করুন:

আমার একটি কোচিং সেন্টার আছে, প্রায় ৬০০ শিক্ষার্থী। ভর্তি, হিসাব আর পরীক্ষা — তিনটি অফিস একই সময়ে তথ্য লিখবে, দুটি কাউন্টারে টাকা জমা হয়। ১. ডেটা CSV/Excel ফাইলে রাখব নাকি SQLite/PostgreSQL-এ — কারণসহ বলো, আর কোন অবস্থায় তোমার উত্তর বদলাবে। ২. টেবিলগুলোর নাম, কলাম, primary key আর foreign key দাও; প্রতিটি নিয়মের জন্য CHECK বা NOT NULL constraint লেখো। ৩. দুই কাউন্টার একসাথে একই শিক্ষার্থীর টাকা জমা নিলে যেন হিসাব না হারায় — transaction দিয়ে SQL দেখাও। ৪. প্রতিটি কোয়েরির সাথে ৩–৪ সারির নমুনা ডেটা আর প্রত্যাশিত ফল দাও, যাতে আমি নিজে চালিয়ে মিলিয়ে নিতে পারি।

AI-এর দেওয়া ডিজাইন বা SQL হাতে পেলে — যাচাইয়ের চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন। এগুলো আপনাকে ডেটা রাখার সিদ্ধান্তের পেছনের যুক্তি বুঝতে সাহায্য করবে।

প্র ০১আধুনিক ফাইল সিস্টেম (NTFS, ext4) তো journaling করে, crash-এর পরও ঠিক থাকে। তাহলে ফাইল সিস্টেম কি এখন DBMS-এর মতোই নিরাপদ?

প্রশ্নটি খুব ভালো, কারণ ফাইল সিস্টেম আসলেই ডেটাবেস থেকে কিছু ধারণা ধার নিয়েছে। Journaling file system (যেমন Linux-এর ext4, Windows-এর NTFS) কোনো বদল করার আগে একটি journal-এ লিখে রাখে কী বদলাতে যাচ্ছে — ঠিক write-ahead logging-এর মতো চিন্তা। ফলে বিদ্যুৎ চলে গেলেও ফাইল সিস্টেমের নিজের গঠন — কোন ফাইল কোথায়, কোন ব্লক খালি — নষ্ট হয় না।

কিন্তু পার্থক্যটা গুরুত্বপূর্ণ। ext4 ডিফল্টভাবে মূলত metadata (ফাইলের নাম, আকার, ব্লকের তালিকা) journal করে, ফাইলের ভেতরের ডেটা সাধারণত নয়। আর সবচেয়ে বড় কথা, ফাইল সিস্টেম জানে না আপনার “একটি কাজ” কোনটি। করিমের ফাইল আর সেলিনার ফাইল — দুটি আলাদা ফাইলে দুটি লেখাকে একসাথে “হয় দুটোই, নয়তো কোনোটিই না” বলার সাধারণ কোনো উপায় ফাইল সিস্টেম দেয় না। Microsoft Windows Vista-তে Transactional NTFS (TxF) নামে এমন একটি সুবিধা এনেছিল, কিন্তু পরে নিজেরাই এর ব্যবহার নিরুৎসাহিত করে — কারণ জটিলতা বেশি, ব্যবহার কম, আর ডেভেলপাররা এই কাজে ডেটাবেসই বেছে নিতেন।

এ ছাড়া ফাইল সিস্টেমে query language নেই, schema নেই, constraint নেই, কলাম-স্তরের অনুমতি নেই, আর একই ফাইলে বহু লেখককে সমন্বয় করার ব্যবস্থা (lock আছে, কিন্তু সাধারণত পুরো ফাইল বা বাইট-রেঞ্জ স্তরে, এবং অ্যাপকে নিজে ব্যবহার করতে হয়) খুবই প্রাথমিক। উল্টো দিকে, ডেটাবেস নিজেই ফাইল সিস্টেমের ওপর দাঁড়িয়ে থাকে — PostgreSQL বা SQLite-এর ডেটা শেষ পর্যন্ত ডিস্কের ফাইলেই থাকে। পার্থক্য হলো, সেই ফাইলের ভেতরে কী লেখা হবে, কোন ক্রমে, কখন fsync দিয়ে ডিস্কে নিশ্চিত করা হবে — সব নিয়ন্ত্রণ করে DBMS.

মূল উপলব্ধি: Journaling ফাইল সিস্টেমকে নিজের গঠনের জন্য নিরাপদ করে; DBMS আপনার ডেটার অর্থ — নিয়ম, সম্পর্ক, একাধিক বদলের একসাথে হওয়া — নিরাপদ রাখে। স্তর দুটি আলাদা, আর দুটিই দরকার।

প্র ০২Bachman-এর “নাবিক” প্রোগ্রামার আর Codd-এর “শুধু কী চাই বলুন” — relational পথ শেষ পর্যন্ত জিতল কেন?

IDS বা CODASYL-ধাঁচের network ডেটাবেসে প্রোগ্রামার লিখতেন অনেকটা এভাবে: “এই গ্রাহকের রেকর্ডে যাও, তার প্রথম অর্ডারের pointer ধরো, পরের অর্ডারে যাও, যতক্ষণ না শেষ হয়…”। এটি খুব দ্রুত হতে পারে, কারণ পথটি আগে থেকেই ডিস্কে pointer হিসেবে বাঁধা। সমস্যা হলো, পথটি প্রোগ্রামের ভেতরেও বাঁধা। ডেটার গঠন বদলালে — নতুন ধরনের link, রেকর্ড অন্যভাবে সাজানো — প্রোগ্রামও বদলাতে হতো। আর আগে থেকে ভাবা হয়নি এমন প্রশ্ন (ad-hoc) করা মানে নতুন করে পথ খোঁজার প্রোগ্রাম লেখা — ঠিক ফাইল-যুগের সমস্যাটিই একটু উন্নত রূপে।

Codd-এর ১৯৭০ সালের প্রবন্ধের মূল দাবি ছিল data independence: ব্যবহারকারী শুধু টেবিল আর তাদের মান দেখবেন; ডিস্কে কীভাবে রাখা, কোন pointer বা index — সেগুলো লুকানো থাকবে। প্রশ্ন লেখা হবে গণিতের ভাষায় (relational algebra ও calculus, পর্ব ৩২–৩৪), আর সিস্টেম নিজে সবচেয়ে ভালো পথ বের করবে। সমালোচকরা বললেন, “এটি তত্ত্বে সুন্দর, বাস্তবে ধীর হবে।” ১৯৭০-এর দশকে IBM-এর System R প্রকল্প এর উত্তর দেয়: সেখানেই SQL-এর পূর্বসূরি SEQUEL তৈরি হয়, আর Patricia Selinger ও সহকর্মীরা cost-based query optimizer-এর ধারণা দেন — সিস্টেম পরিসংখ্যান দেখে নিজেই পথ বেছে নেয় (পর্ব ৪৩)। একই সময়ে Berkeley-তে Michael Stonebraker ও Eugene Wong-এর Ingres দেখায় যে relational সিস্টেম বাস্তবে বানানো যায়।

জয়ের আসল কারণ তাই গতি নয়, পরিবর্তনের খরচ। হার্ডওয়্যার প্রতি বছর সস্তা হচ্ছিল, কিন্তু প্রোগ্রামারের সময় দামি থেকে আরও দামি হচ্ছিল। যে সিস্টেমে ডেটার গঠন বদলালে প্রোগ্রাম বদলাতে হয় না, আর নতুন প্রশ্ন এক লাইনে করা যায়, দীর্ঘমেয়াদে সেটিই সস্তা।

মূল উপলব্ধি: “কীভাবে” লুকিয়ে “কী” প্রকাশ করা — declarative চিন্তা — কম্পিউটিংয়ের একটি গভীর ধারা: SQL, HTML/CSS, spreadsheet-এর সূত্র, এমনকি AI-কে প্রম্পট দেওয়াও। দাম হলো, পর্দার পেছনে কী ঘটছে না বুঝলে ধীর কোয়েরি কেন ধীর, তা বোঝা যায় না — তাই এই কোর্সে মডিউল ৬ আছে।

প্র ০৩১৯৬০-এর দশকের IMS আর COBOL প্রোগ্রাম আজও বড় ব্যাংকে চলে। নতুন প্রযুক্তিতে সরিয়ে নেওয়া এত কঠিন কেন?

IBM এখনো IMS বিক্রি ও হালনাগাদ করে, আর তাদের ভাষ্য অনুযায়ী বিশ্বের বহু বড় ব্যাংক, বিমা কোম্পানি ও সরকারি সংস্থা প্রতিদিন IMS আর COBOL-এ বিপুল সংখ্যক লেনদেন চালায়। এর পেছনে কয়েকটি বাস্তব কারণ আছে।

  • কাজ করছে, এবং দ্রুত: hierarchical গঠন নির্দিষ্ট ধরনের প্রশ্নে — যেমন “এই হিসাবের সব লেনদেন” — খুবই দ্রুত, কারণ পথটি আগে থেকেই বাঁধা। কয়েক দশক ধরে টিউন করা সিস্টেম।
  • নিয়মগুলো কোডের ভেতরে: এই পর্বের “সমস্যা ৪” (integrity) মনে করুন। চল্লিশ বছরের সুদের হিসাব, কর, ব্যতিক্রম — অনেক নিয়ম কোথাও লিখিত নেই, আছে শুধু COBOL কোডে। যাঁরা লিখেছিলেন, অনেকে অবসরে। নতুন সিস্টেমে সরাতে হলে আগে কোড পড়ে নিয়মগুলো উদ্ধার করতে হয়।
  • ঝুঁকি অসম: সফল হলে লাভ ধীরে আসে; ব্যর্থ হলে ব্যাংকের লেনদেন বন্ধ, খবরের শিরোনাম। বিশ্বজুড়ে বহু বড় migration প্রকল্প সময় ও বাজেট ছাড়িয়ে গেছে।

২০২০ সালের এপ্রিলে কোভিডের সময় যুক্তরাষ্ট্রের New Jersey অঙ্গরাজ্যের বেকার-ভাতার সিস্টেমে হঠাৎ আবেদনের চাপ বাড়লে গভর্নর প্রকাশ্যে COBOL জানা স্বেচ্ছাসেবী প্রোগ্রামার চান — পুরোনো সিস্টেম নিয়ে এই ঘটনা ব্যাপক আলোচিত হয়। বাংলাদেশেও অনেক প্রতিষ্ঠানে কয়েক প্রজন্মের পুরোনো সফটওয়্যার আর তার পাশে বহু Excel শিট একসাথে চলে; নতুন ডিজিটাল সেবা চালু করতে গেলে প্রথম কাজ হয় এগুলোর ডেটা মিলিয়ে পরিষ্কার করা।

মূল উপলব্ধি: সফটওয়্যারের আসল মূল্য প্রায়ই তার ভেতরের ডেটা আর নিয়মে, কোডের ভাষায় নয়। নিয়ম যদি constraint আর স্পষ্ট schema হিসেবে ডেটাবেসে লেখা থাকে, ভবিষ্যতে প্রযুক্তি বদলানো অনেক সহজ হয়। আজ আপনার ডিজাইন করা ডেটাবেসও হয়তো ত্রিশ বছর চলবে — সেই মানুষটির কথা ভেবে ডিজাইন করুন যিনি তখন এটি বুঝতে চেষ্টা করবেন।

প্র ০৪Google Sheets বা Excel কি একরকম ডেটাবেস নয়? কখন শিট ছেড়ে সত্যিকারের ডেটাবেসে যাওয়া উচিত?

Spreadsheet দেখতে টেবিলের মতো, আর ছোট পরিসরে সত্যিই ডেটাবেসের কিছু কাজ করে — সারি, কলাম, filter, sort, এমনকি Google Sheets-এ একসাথে কয়েকজন সম্পাদনা। Excel-এ data validation দিয়ে কিছু নিয়মও বসানো যায়। তাহলে পার্থক্য কোথায়?

  • নিয়ম ঐচ্ছিক ও দুর্বল: Validation কপি-পেস্টে সহজেই এড়ানো যায়; একটি কলামে সংখ্যা আর লেখা মিশে থাকতে পারে। ডেটাবেসে constraint এড়ানো যায় না।
  • সম্পর্ক নেই: দুই শিটের মধ্যে “এই রোল অবশ্যই ভর্তি শিটে থাকতে হবে” — এমন foreign key ধরনের নিয়ম সাধারণভাবে নেই; VLOOKUP সম্পর্ক খোঁজে, পাহারা দেয় না।
  • আকার ও গতি: Excel শিটে সর্বোচ্চ ১০,৪৮,৫৭৬টি সারি; Google Sheets-এ পুরো ফাইলে কোটি খানেক ঘরের সীমা আছে। কয়েক লক্ষ সারিতেই সূত্র ধীর হয়ে যায়। ডেটাবেস কোটি কোটি সারিতে index দিয়ে মিলিসেকেন্ডে খোঁজে।
  • Transaction ও ইতিহাস: একসাথে কয়েকটি ঘর বদলানোকে “একটি কাজ” বলার উপায় নেই; ভুল সূত্র টেনে দিলে কয়েক হাজার ঘর নীরবে বদলায়।

বাস্তবের একটি সতর্কবার্তা: ২০১০ সালে দুজন বিখ্যাত অর্থনীতিবিদ, Reinhart ও Rogoff-এর একটি প্রভাবশালী গবেষণাপত্রের হিসাব Excel-এ করা হয়েছিল। ২০১৩ সালে University of Massachusetts Amherst-এর এক স্নাতকোত্তর শিক্ষার্থী, Thomas Herndon, ফল পুনরায় করতে গিয়ে দেখেন একটি সূত্রের পরিসর থেকে কয়েকটি দেশের সারি বাদ পড়ে গিয়েছিল — অন্য পদ্ধতিগত প্রশ্নের সাথে এটিও ফলাফলে প্রভাব ফেলে। কেউ ইচ্ছে করে ভুল করেননি; টুলটি ভুল ধরার জন্য তৈরি ছিল না।

শিট ছাড়ার সংকেত: একাধিক মানুষ নিয়মিত লেখেন; একই তথ্য কয়েকটি শিটে কপি হচ্ছে; “কোনটি সর্বশেষ ফাইল?” প্রশ্ন উঠছে; ব্যক্তিগত বা আর্থিক তথ্য আছে; সারি লাখ ছাড়াচ্ছে; বা একটি ভুলের দাম অনেক।

মূল উপলব্ধি: Spreadsheet হলো হিসাব আর বিশ্লেষণের খাতা; ডেটাবেস হলো সত্যের একক উৎস। ভালো ব্যবস্থায় দুটিই থাকে — ডেটা থাকে ডেটাবেসে, আর বিশ্লেষণের জন্য তার একটি কপি spreadsheet-এ টেনে আনা হয়।

প্র ০৫Big data-র যুগে আবার বিশাল ফাইলে (data lake) ডেটা রাখা শুরু হলো কেন? ফাইল-সমস্যাগুলো কি ফিরে এলো?

২০০০-এর দশকে Google-এর মতো প্রতিষ্ঠান এত ডেটা নিয়ে কাজ শুরু করে যে একটি ডেটাবেস সার্ভারে আর আঁটে না। Google ২০০৩ সালে Google File System (GFS) আর ২০০৪ সালে MapReduce নিয়ে গবেষণাপত্র প্রকাশ করে — হাজার হাজার সাধারণ কম্পিউটারে ভাগ করা বিশাল ফাইল, আর তার ওপর চলা প্রোগ্রাম। এর অনুপ্রেরণায় তৈরি হয় open-source Hadoop. কিছু সময়ের জন্য মনে হচ্ছিল, “ডেটাবেস লাগবে না, শুধু ফাইল আর প্রোগ্রাম।”

লক্ষ করুন — এটি প্রায় হুবহু ষাটের দশকের মডেল: ফাইল, আর প্রতিটি প্রশ্নের জন্য একটি প্রোগ্রাম (MapReduce job). আর সমস্যাগুলোও ফিরে এলো। ২০০৮ সালে ডেটাবেস গবেষক David DeWitt ও Michael Stonebraker একটি আলোচিত লেখায় MapReduce-কে ডেটাবেসের দৃষ্টিকোণ থেকে “বড় এক পা পিছিয়ে যাওয়া” বলে সমালোচনা করেন — schema নেই, index নেই, declarative ভাষা নেই। বাস্তবেও দেখা গেল, data lake-এ কোন ফাইলে কী আছে, কোনটি সর্বশেষ, দুটি job একসাথে লিখলে কী হয় — এসব প্রশ্নের উত্তর কেউ জানে না। শিল্পে একে মজা করে বলা হতো “data swamp” (জলাভূমি)।

এরপর কী হলো? ধীরে ধীরে ডেটাবেসের প্রতিটি বৈশিষ্ট্য ফাইলের ওপর আবার যোগ করা হলো: Hive আর Spark SQL এনে দিল SQL; Parquet-এর মতো ফরম্যাট এনে দিল schema; আর Delta Lake, Apache Iceberg, Apache Hudi-র মতো table format ফাইলের ওপর এনে দিল ACID transaction আর একসাথে লেখার নিয়ন্ত্রণ। আজ একে বলা হয় “lakehouse”. ডেটা এখনো ফাইলে, কিন্তু ফাইলগুলো এখন একটি DBMS-এর নিয়ন্ত্রণে।

মূল উপলব্ধি: প্রযুক্তি বদলায়, সমস্যা বদলায় না। যেকোনো ডেটা-ব্যবস্থা — ফাইল, শিট, NoSQL বা data lake — যদি অনেক মানুষ ব্যবহার করেন এবং দীর্ঘদিন চলে, তাকে শেষ পর্যন্ত এই পর্বের সাতটি সমস্যার উত্তর দিতে হয়। নতুন কোনো ডেটা টুল দেখলে প্রশ্ন করুন: redundancy, integrity, atomicity, concurrency আর নিরাপত্তা এটি কীভাবে সামলায়?

অনুশীলন

কয়েকটি হাতে হিসাব, একটি কোয়েরি লেখা, আর কয়েকটি সিদ্ধান্ত — উত্তর দেখার আগে নিজে চেষ্টা করুন।

  1. হাতে trace করুন — lost update: একটি হিসাবে ২০০০ টাকা আছে। T1 ৫০০ টাকা জমা দেয়, T2 ৩০০ টাকা তোলে। ক্রম: T1 পড়ে, T2 পড়ে, T2 লেখে, T1 লেখে — কোনো lock নেই। শেষে হিসাবে কত থাকবে? সঠিক উত্তর কত হওয়া উচিত? কোন লেনদেনটি হারাল?

    T1 পড়ে ২০০০, T2 পড়ে ২০০০. T2 লেখে ২০০০ − ৩০০ = ১৭০০. তারপর T1 নিজের হাতের পুরোনো ২০০০ থেকে হিসাব করে লেখে ২০০০ + ৫০০ = ২৫০০. সঠিক উত্তর ২০০০ + ৫০০ − ৩০০ = ২২০০. এবার হারাল T2-এর তোলা — অর্থাৎ গ্রাহক ৩০০ টাকা হাতে পেলেন, অথচ হিসাব থেকে কাটা হলো না। Lost update-এ কোন লেখাটি হারায়, তা নির্ভর করে কে শেষে লেখে তার ওপর; শেষজন আগের জনের লেখা মুছে দেয়।

  2. কোয়েরি লিখুন: দোকানের নমুনা ডেটাবেসে (products টেবিল: product_id, name, price, stock) যেসব পণ্যের মজুত শূন্য, তাদের নাম আর দাম দেখানোর কোয়েরি লিখুন। উপরের যেকোনো দোকান-editor-এ লিখে চালিয়ে দেখুন।
    SELECT name, price
    FROM products
    WHERE stock = 0;

    ফল একটি সারি: Power Bank · 1800. ফাইল-ভিত্তিক ব্যবস্থায় এই প্রশ্নের জন্য গুদামের ফাইল পড়ার একটি ছোট প্রোগ্রাম লিখতে হতো; এখানে তিন লাইন। বাড়তি চেষ্টা: WHERE stock < 10 লিখলে আসে Power Bank (০), Saree (৮টি) আর Smart Watch (৫টি)।

  3. সমস্যা চিনুন: প্রতিটি ঘটনা ফাইল-ভিত্তিক ব্যবস্থার কোন সমস্যা? (ক) হিসাবের ফাইলে রোল 0101, পরীক্ষার ফাইলে 101, মেলানো যাচ্ছে না। (খ) এক ক্লার্ক Excel-এ একজনের নম্বর ১৫০ লিখে দিলেন, কেউ আটকাল না। (গ) পরীক্ষা অফিসের কম্পিউটারে অভিভাবকদের ফোন নম্বর পুরোটাই দেখা যায়। (ঘ) ফি জমার রসিদ ছাপা হলো, কিন্তু ফাইলে লেখার আগেই কম্পিউটার hang করল।

    (ক) Data isolation — ভিন্ন ফাইল, ভিন্ন ফরম্যাট। (খ) Integrity-র সমস্যা — “নম্বর ০–১০০” নিয়মটি ডেটার সাথে নেই; DBMS-এ CHECK (marks BETWEEN 0 AND 100) এটি আটকাত। (গ) নিরাপত্তার সমস্যা — ফাইল-স্তরের অনুমতি, কলাম-স্তরের নয়। (ঘ) Atomicity-র সমস্যা — “রসিদ দেওয়া” আর “জমা লেখা” একটি কাজের দুই অংশ, একটি হলো, অন্যটি হলো না।

  4. ফাইল না DBMS? প্রতিটির জন্য সিদ্ধান্ত নিন, কারণসহ: (ক) একটি ওয়েব সার্ভারের প্রতিদিনের access log; (খ) একটি জেলা হাসপাতালের রোগী ভর্তি ও ওষুধ বিতরণ, ২৪ ঘণ্টা তিনটি শিফটে; (গ) আপনার নিজের মাসিক খরচের হিসাব; (ঘ) একটি অনলাইন বাস-টিকিট বিক্রির সাইট।

    (ক) ফাইল — শুধু শেষে যোগ হয়, কেউ বদলায় না; পরে বিশ্লেষণ দরকার হলে log থেকে ডেটাবেস বা বিশ্লেষণ-টুলে তোলা যায়। (খ) DBMS — বহু মানুষ একসাথে লেখেন, নিয়ম কঠোর (যে ওষুধ মজুত নেই তা দেওয়া যাবে না), তথ্য সংবেদনশীল, ভুলের দাম জীবন। (গ) ফাইল বা spreadsheet যথেষ্ট — একজন ব্যবহারকারী, ছোট ডেটা; চাইলে SQLite-ও চলে। (ঘ) DBMS — শেষ সিটটি দুজনকে বিক্রি না হওয়া ঠিক concurrency control-এর কাজ, আর টাকা কাটা ও সিট বরাদ্দ একটি transaction.

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমঘটনাগুলো সময়ের ক্রমে সাজান (▲▼ চেপে সরান)

  1. 🗂️ Hollerith-এর পাঞ্চ কার্ডে আদমশুমারি গণনা
  2. 💾 COBOL ভাষার নকশা
  3. 🕸️ General Electric-এ Bachman-এর IDS
  4. 🚀 Apollo প্রকল্পের জন্য IBM-এর IMS চালু
  5. 📊 Codd-এর relational model প্রবন্ধ
  6. 🏢 Oracle-এর বাণিজ্যিক SQL ডেটাবেস বাজারে

একটি প্রতিষ্ঠানে একজন কর্মীর ঠিকানা বেতন-ফাইলে একরকম, আর ছুটি-ফাইলে আরেকরকম। এটি কোন সমস্যার সবচেয়ে সঠিক নাম?

  • Data isolation
  • Data inconsistency
  • Atomicity-র সমস্যা
  • নিরাপত্তার সমস্যা

একটি হিসাবে ৫০০০ টাকা। দুজন ক্লার্ক কোনো lock ছাড়া একই সময়ে ৫০০০ পড়লেন; একজন ১০০০ যোগ করে লিখলেন, তারপর অন্যজন ৫০০ বাদ দিয়ে লিখলেন। শেষে হিসাবে কত থাকবে?

  • ৫৫০০
  • ৬০০০
  • ৪৫০০
  • ৫০০০

ব্যাংক transfer-এ টাকা কাটা হলো, কিন্তু অন্য হিসাবে জমার আগেই সিস্টেম crash করল। DBMS-এর কোন বৈশিষ্ট্য নিশ্চিত করে যে এমন “অর্ধেক” অবস্থা থেকে যাবে না?

  • Foreign key constraint
  • Index
  • Access control (GRANT)
  • Transaction আর log-ভিত্তিক recovery (atomicity)

IBM-এর IMS কোন ডেটা মডেলের ওপর তৈরি, আর প্রথমে কোন প্রকল্পের জন্য?

  • Hierarchical model — Apollo মহাকাশ প্রকল্প
  • Relational model — Apollo মহাকাশ প্রকল্প
  • Network model — আদমশুমারি
  • Document model — ব্যাংকিং

নিচের কোন ক্ষেত্রে পূর্ণাঙ্গ DBMS-এর চেয়ে সাধারণ ফাইল বেশি উপযুক্ত?

  • একটি ট্রেনের অনলাইন টিকিট বুকিং ব্যবস্থা
  • একটি অ্যাপের প্রতিদিনের error log
  • একটি ব্যাংকের গ্রাহক হিসাব
  • একটি হাসপাতালের রোগী ভর্তি ও ওষুধ বিতরণ

products টেবিলে CHECK (price > 0) আছে। কেউ price = 0 দিয়ে একটি সারি INSERT করলে কী হবে?

  • সারিটি ঢুকবে, শুধু একটি warning আসবে
  • দাম নিজে থেকে 1 হয়ে সারিটি ঢুকবে
  • INSERT ব্যর্থ হবে, constraint ভাঙার error আসবে
  • অ্যাপের কোডে যাচাই না থাকলে সারিটি ঢুকে যাবে

Relational model প্রথম কে প্রস্তাব করেন, এবং মূল ধারণাটি কী?

  • Charles Bachman — রেকর্ডগুলো pointer দিয়ে যুক্ত
  • Herman Hollerith — প্রতিটি রেকর্ড একটি কার্ডে
  • Grace Hopper — ব্যবসার জন্য ইংরেজির মতো প্রোগ্রামিং ভাষা
  • Edgar F. Codd — ডেটা টেবিলে, প্রশ্নে শুধু “কী চাই”

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. File processing system-এ প্রতিটি প্রোগ্রাম নিজের ফাইল আর নিজের নিয়ম রাখে; ডেটার গঠন লেখা থাকে কোডে।
  2. ক্লাসিক সমস্যা: redundancy ও inconsistency, ডেটা পাওয়া কঠিন, isolation, integrity, atomicity, concurrent access, security.
  3. DBMS-এর উত্তর: এক জায়গায় ডেটা, SQL, constraint, transaction ও recovery, lock, GRANT — প্রতিটি সমস্যার জন্য একটি করে।
  4. DBMS-এর দাম আছে — জটিলতা, খরচ, বাড়তি বোঝা; log, config, ছোট এক-ব্যবহারকারীর কাজে ফাইলই ঠিক।
  5. ইতিহাস: IDS (Bachman) ও IMS (IBM, Apollo) → CODASYL → Codd-এর relational model, ১৯৭০; আর আজকের spreadsheet পুরোনো ফাইল-সমস্যার নতুন রূপ।

পরের পর্বে: DBMS-এর ভেতরে তাকাব — ব্যবহারকারী যা দেখেন, ডেটাবেস যা বোঝে আর ডিস্কে যা থাকে, এই তিন স্তর (three-schema architecture), আর ডিস্কের গঠন বদলালেও প্রোগ্রাম কেন বদলাতে হয় না।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান