আগের পর্বে Firestore আর Realtime Database-এর পার্থক্য বুঝেছিলাম, আর ঠিক করেছিলাম এই সিরিজে আমরা Realtime Database (RTDB) নিয়ে গভীরভাবে কাজ করব। আজ থেকে শুরু হাতেকলমে কাজ — Console-এ Database তৈরি করা, JSON স্ট্রাকচার ডিজাইন করা, আর বেসিক Security Rules বোঝা।
Console-এ Database তৈরি করা
- Firebase Console-এ নিজের প্রজেক্টে যান
- বাম মেনু থেকে Build → Realtime Database-এ যান
- Create Database চাপুন
- একটা লোকেশন বেছে নিন (যেমন
asia-southeast1— বাংলাদেশের কাছাকাছি সার্ভার হলে লেটেন্সি কম হবে) - Security Rules-এর মোড বেছে নিন — শেখার সময় Test mode বেছে নেওয়া যায় (পুরোপুরি খোলা), কিন্তু প্রোডাকশনে কখনো এটা ব্যবহার করা যাবে না — সেটা পর্ব ৮-এ বিস্তারিত দেখব
Database তৈরি হয়ে গেলে আপনি একটা URL পাবেন, যেমন https://my-first-app-default-rtdb.asia-southeast1.firebasedatabase.app — এটাই পর্ব ১-এর databaseURL-এ বসবে।
JSON ট্রি — RTDB-এর মূল ধারণা
RTDB-এর পুরো ডেটা আসলে একটামাত্র বড় JSON অবজেক্ট। Console-এর Data ট্যাবে গেলে এটা সরাসরি একটা ট্রি-ভিউতে দেখা যায় — ঠিক যেমন ফাইল এক্সপ্লোরারে ফোল্ডার দেখা যায়।
{
"books": {
"-Nx1abc123": {
"title": "অপরাজিত",
"author": "বিভূতিভূষণ",
"year": 1932
},
"-Nx1def456": {
"title": "পথের পাঁচালী",
"author": "বিভূতিভূষণ",
"year": 1929
}
}
}
লক্ষ্য করুন — -Nx1abc123-এর মতো কী গুলো Firebase নিজে থেকেই জেনারেট করে (push() ব্যবহার করলে), যা সময়ের সাথে সাজানো থাকে — এটাকে বলে push ID, পরের পর্বে এটা নিয়ে বিস্তারিত কাজ করব।
ভালো JSON স্ট্রাকচার ডিজাইনের নিয়ম
RTDB নতুনদের যে ভুলটা সবচেয়ে বেশি করে সেটা হলো — SQL-এর মতো ডেটা নেস্ট করে ফেলা। কিন্তু RTDB-তে ফ্ল্যাট স্ট্রাকচার রাখাই ভালো অভ্যাস।
// ❌ খারাপ — গভীরভাবে নেস্টেড, একটা বই আনতে পুরো ইউজার অবজেক্টও আসবে
{
"users": {
"user1": {
"name": "আরিফ",
"books": {
"book1": { "title": "অপরাজিত" },
"book2": { "title": "পথের পাঁচালী" }
}
}
}
}
// ✅ ভালো — ফ্ল্যাট স্ট্রাকচার, প্রতিটা আলাদাভাবে fetch করা যায়
{
"users": {
"user1": { "name": "আরিফ" }
},
"books": {
"book1": { "title": "অপরাজিত", "ownerId": "user1" },
"book2": { "title": "পথের পাঁচালী", "ownerId": "user1" }
}
}
এই ফ্ল্যাট পদ্ধতিকে বলে denormalization — SQL-এর সাথে মেলাতে যাবেন না। এখানে একটা বই আনতে পুরো ইউজার ডেটা লোড করতে হয় না, আর একটা books লিস্টও সহজে আলাদাভাবে fetch করা যায়।
Database Reference — কোড থেকে সংযোগ
কোড থেকে ডেটাবেজের যেকোনো নির্দিষ্ট অংশে পৌঁছাতে ref() ফাংশন ব্যবহার হয় — এটা একটা path নির্দেশ করে, সরাসরি ডেটা আনে না।
import { getDatabase, ref } from "firebase/database";
import { app } from "./firebase";
const db = getDatabase(app);
const booksRef = ref(db, "books"); // পুরো books নোড
const oneBookRef = ref(db, "books/book1"); // একটা নির্দিষ্ট বই
const usersRef = ref(db, "users"); // পুরো users নোড
ref()-কে ভাবতে পারেন একটা ফাইল সিস্টেমের path-এর মতো — path বানানো মাত্রই ডেটা লোড হয় না, পরের পর্বে আমরা set(), push() দিয়ে আসলে ডেটা লেখা শিখব।
Security Rules — এক নজরে
RTDB-এর Rules ট্যাবে একটা JSON-এর মতো নিয়ম লেখা হয়, যা ঠিক করে কে পড়তে/লিখতে পারবে। এই পর্বে শুধু বেসিক ধারণা দেখাচ্ছি — বিস্তারিত পর্ব ৮-এ।
// শেখার জন্য সাময়িক Rules — শুধু লগইন করা ইউজার পড়তে/লিখতে পারবে
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
সতর্কতা: Console-এ Test mode বেছে নিলে ডিফল্ট Rules হয় ".read": true, ".write": true — অর্থাৎ পৃথিবীর যে কেউ আপনার ডেটাবেজ পড়তে বা মুছে ফেলতে পারবে। শেখার সময় ঠিক আছে, কিন্তু কোনো প্রজেক্ট লাইভ করার আগে এটা অবশ্যই বদলাতে হবে।
ইন্টারেক্টিভ — JSON ট্রি এক্সপ্লোরার
নিচে একটা ছোট JSON ট্রি দেওয়া আছে — নোডে ক্লিক করে দেখো কীভাবে path তৈরি হয়, ঠিক যেমন Firebase Console-এর Data ট্যাবে হয়।
নিজে চেষ্টা করো
Exercise:
- নিজের Firebase প্রজেক্টে Realtime Database তৈরি করো, Console-এ Data ট্যাবে গিয়ে ম্যানুয়ালি একটা
booksনোডের নিচে একটা বই যোগ করো। - উপরের "খারাপ" আর "ভালো" স্ট্রাকচার দুটো দেখে নিজের একটা প্রজেক্ট আইডিয়ার (যেমন Todo App) জন্য ফ্ল্যাট JSON স্ট্রাকচার ডিজাইন করো, কাগজে বা টেক্সট ফাইলে লিখে ফেলো।
ref()দিয়ে নিজের ডেটাবেজের বিভিন্ন path-এ কীভাবে পৌঁছানো যায় তা কোডে লিখে অনুশীলন করো (এখনো ডেটা fetch করা লাগবে না)।
পরের পর্বে যা থাকছে
পরের পর্বে আমরা শিখব Write অপারেশন — set(), push(), আর update() দিয়ে সত্যিকারের ডেটা কীভাবে লিখতে হয়, আর তিনটার মধ্যে পার্থক্য কী।