এসকিউএল টেবিল তৈরি এবং ডেটা টাইপ

এসকিউএল ডেটা টাইপ

টেবিল তৈরি করার সময় কোন কলামে কি ধরণের ডেটা রাখব, তা বলে দিতে হয়। বেশির ভাগ SQL ডেটাবেজে সাধারণত নিচের ডেটা টাইপ গুলো ব্যবহার করা যায়। কিছু কিছু ডেটাবেজে এগুলো ছাড়াও অন্যান্য ডেটা টাইপ সাপোর্ট করে।

INTEGER:

ইন্টিজার বলতে পূর্ণ সংখ্যা বুঝায়। যেমন 1, 2 ,3 4 ইত্যাদি। কোন কলামে যদি পূর্ণ সংখ্যা স্টোর করতে চাই, তখন INTEGER ডেটা টাইপ ব্যবহার করব। যেমনঃ

CREATE TABLE users (
  age INTEGER
);

REAL:

দশমিক সংখ্যা যে কলামে স্টোর করব, সে কলাম তৈরির সময় REAL ডেটা টাইপ ব্যবহার করব। যেমনঃ

CREATE TABLE products (
  price REAL
);

TEXT:

কোন কলামে স্ট্রিং স্টোর করতে চাইলে TEXT ডেটা টাইপ ব্যবহার করব। যেমনঃ

CREATE TABLE books (
  title TEXT,
  author TEXT
);

BLOB:

বাইনারি ডেটা স্টোর করার জন্য BLOB ডেটা টাইপ ব্যবহার করা হয়। সাধারণত ডেটাবেজে ইমেজ বা অন্য কোন ফাইল, যেগুলোর ডেটা টাইপ সাপোর্ট করে না, সেগুলো এই BLOB ডেটা টাইপ ব্যবহার করে ডেটাবেজে স্টোর করা যায়। প্রথমে ইমেজকে বাইনারি ডেটাতে রূপান্তর করা হয়, এরপর ঐ বাইনারি ডেটা ডেটাবেজে স্টোর করা হয়। বুঝার সুবিধার্থে ইমেজের কথা বলছি। সাধারণত ডেটাবেজে ইমেজ সরাসরি স্টোর করা হয় না। কারণ তখন ডেটাবেজের সাইজ অনেক বড় হয়ে যাবে। তার পরিবর্তে ইমেজ একটা লোকেশনে আপলোড করে ঐ ডিরেক্টরি লোকেশনটা ডেটাবেজে স্টোর করা হয়। তবে কোন ফাইল ডেটা যেমন CSV বা অন্য কোন টেক্সট ফাইল এভাবে সহজে রাখা যায়। যেমনঃ

CREATE TABLE files (
  file_data BLOB
);

BOOLEAN:

বুলিয়ান ডেটা, যেমন 0, 1 বা ট্রু, ফলস রাখার জন্য BOOLEAN ডেটা টাইপ ব্যবহার করা হয়। যেমনঃ

CREATE TABLE settings (
  is_active INTEGER DEFAULT 0
);

উপরে ডিফল্ট ভাবে 0 এসাইন করেছি। ডেটা ইনসার্ট করার সময় এই ভ্যালু যদি না দেওয়া হয়, তাহলে অটোম্যাটিকেলি 0 এসাইন হবে।

DATE/TIME:

যে কোন প্রজেক্টেই টাইম অনেক গুরুত্বপূর্ণ। ডেটাবেজ কলামে কখন কোন রেকর্ড তৈরি হয়েছে এবং আপডেট হয়েছে, এসবের ট্র্যাক রাখা গুড প্র্যাকটিস। কিছু কিছু ডেটাবেজ ম্যানেজমেন্ট সিস্টেমে ডিফল্ট DATE/TIME ডেটা টাইপ থাকে। আমরা উদাহরণ হিসেবে SQLite ব্যবহার করছি। SQLite এ DATE/TIME ডেটা টাইপ নেই। তবে এই ক্ষেত্রে আমরা ডেট এবং টাইমকে ইন্টিজার হিসেবে রাখতে পারি। যে কোন সমকে ইন্টিজারে রূপান্তর করা যায়। অথবা টেক্সট হিসেবেও রাখতে পারি। এটা আপনার উপর নির্ভর করে।

CREATE TABLE events (
  created_at INTEGER  
);

ডেটাবেজে টেবিল তৈরি

এর আগের লেখা গুলতে আমরা ইতিমধ্যে শিখেছি কিভাবে টেবিল তৈরি করতে হয়। যেমনঃ

CREATE TABLE users (
  id INTEGER PRIMARY KEY AUTO_INCREMENT, 
  name TEXT, 
  email TEXT
);

এখানেঃ

  • id প্রাইমারি কী হিসেবে ব্যবহৃত হবে। এবং এর ভ্যালু অটোম্যাটিক্যালি বাড়বে। যেমন 1 , 2, 3 ইত্যাদি।
  • name এবং email কলামে স্ট্রিং রাখা যাবে।

আমরা চাইলে টেবিল তৈরি করার সময় কোন কলামের ডিফল্ট ভ্যালু সেট করে দিতে পারি। ফলে ঐ টেবিলে নতুন রেকর্ড ইনসার্ট করার সময় যদি ঐ কলামের ভ্যালু নাও দেওয়া হয়, ডিফল্ট ভ্যালু ব্যবহার করবে। যেমনঃ

CREATE TABLE customers (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL, 
  balance REAL DEFAULT 0.0, 
  join_date INTEGER
);

ডেটাবেজ ডিজাইন

ডেটাবেজ ম্যানেজমেন্ট সিস্টেমের মূল শক্তি হচ্ছে একটাধিক টেবিলের মধ্যে সম্পর্ক। যেমন আমরা একটা নোট অ্যাপের কথা চিন্তা করি। যেখানে ইউজার থাকবে এবং ইউজাররা লগিন করে নোট লিখে সেভ করতে পারবে। তো প্রতিটা নোটে তো এমন একটা রেফারেন্স লাগবে, যা দিয়ে বুঝা যাবে ঐ নোটটা কার। এই রেফারেন্সের কাজ করা হয় FOREIGN KEY এর মাধ্যমে।

একটা প্রজেক্ট তৈরি করার পূর্বে চিন্তা করতে হয় ডেটা গুলো কিভাবে সাজিয়ে রাখব। ডেটা যত ইফিশিয়েন্টলি সাজিয়ে রাখা যাবে, প্রোগ্রাম তত ইফিশিয়েন্টলি কাজ করবে। সিম্পল একটা নোট অ্যাপের কথা চিন্তা করি। যেখানে আমাদের মিনিমাম দুইটা টেবিল লাগবে। একটা হচ্ছে user রাখার জন্য। আরেকটা হচ্ছে note রাখার জন্য। তো users টেবিল এভাবে তৈরি করতে পারি।

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL
);

এরপর notes টেবিল এভাবে তৈরি করতে পারিঃ

CREATE TABLE notes (
    note_id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER NOT NULL,
    title TEXT NOT NULL,
    content TEXT,
    created_at TEXT DEFAULT (datetime('now', 'localtime')),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

এখানেঃ

  • note_id হচ্ছে নোট টেবিলের প্রাইমারি কী, যা অটোম্যাটিক্যালি ইঙ্ক্রিমেন্ট হবে।
  • user_id হচ্ছে ফরেইন কী। যেখানে নোটটি কোন ইউজারের, তার রেফারেন্স থাকবে।
  • title হচ্ছে টেক্সট ডেটা টাইপ, যেটা খালি রাখা যাবে না।
  • content নোটের কন্টেন্ট রাখার কলাম, টেক্সট ডেটা টাইপ।
  • created_at দিয়ে নোটটা কখন তৈরি হচ্ছে, সে সময়টা সেভ করা হবে টেক্সট আকারে। এই ডেট-টাইম অটোম্যাটিক্যালি এসাইন হবে।
  • FOREIGN KEY (user_id) REFERENCES users(id): এটা দিয়ে আমরা একটা কনস্ট্রেইন তৈরি করছি। যেন প্রতিটা নোট কোন ইউজারের, তার রেফারেন্স থাকে।

উপরের দুইটা টেবিল তৈরির পর চাইলে আমরা ডেটা ইনসার্ট করে দেখতে পারি ঠিক মত ফরেইন কি কাজ করছে কিনা। তার জন্য প্রথমে একটা ইউজার তৈরি করে নেইঃ

INSERT INTO users (name, email) VALUES ('Alice Smith', '[email protected]');

এরপর এবার নোট টেবিলে কিছু নোট ইনসার্ট করিঃ

INSERT INTO notes (user_id, title, content) VALUES (1, 'Shopping List', 'Buy milk, eggs, and bread');

INSERT INTO notes (user_id, title, content) VALUES (1, 'Meeting Notes', 'Discuss project milestones');

নির্দিষ্ট ইউজারের নোট গুলো কুয়েরি করাঃ

SELECT * FROM notes WHERE user_id = 1;

সুন্দর না? এই পর্যন্ত আমরা যা শিখেছি, তা দিয়ে মোটামুটি ছোট খাটো কিছু প্রজেক্টের ডেটাবেজ ডিজাইন করে ফেলতে পারব। পারব না?

SQL নিয়ে অন্যান্য লেখা গুলো পাওয়া যাবে বাংলায় ডেটাবেজ টিউটোরিয়াল – SQL পেইজে।

Leave a Reply