ফ্রি টুল

ডেটাবেস স্কিমা প্ল্যানার

নতুন অ্যাপ শুরু করছেন আর খালি ডেটাবেসের দিকে তাকিয়ে আছেন? প্রজেক্ট টাইপ ও ফিচার বাছুন — টেবিল, ফিল্ড, রিলেশন, ইনডেক্স ও ERD পেয়ে যান।

স্কিমা প্ল্যান করি

ফিচার

স্কিমা

টেবিল

ERD (রিলেশন)

users          1 ──< profiles
users          1 ──< posts
posts          1 ──< comments
users          1 ──< comments
users          1 ──< notifications
users          1 ──< followers
users          1 ──< reactions
users          1 ──< device_tokens

users

PKidBIGINT
nameVARCHAR(120)
UQemailVARCHAR(160)
passwordVARCHAR(255)
email_verified_atTIMESTAMP NULL
created_atTIMESTAMP
updated_atTIMESTAMP

index: email (unique)

profiles

PKidBIGINT
FKuser_idBIGINT
bioTEXT NULL
avatarVARCHAR(255) NULL
phoneVARCHAR(20) NULL
created_atTIMESTAMP
updated_atTIMESTAMP

↳ belongs to users

index: user_id

posts

PKidBIGINT
FKuser_idBIGINT
UQslugVARCHAR(220)
titleVARCHAR(200)
bodyTEXT
IDXstatusENUM(draft,published)
views_countINT DEFAULT 0
created_atTIMESTAMP
updated_atTIMESTAMP
deleted_atTIMESTAMP NULL

↳ belongs to users

index: user_id, status, slug (unique)

comments

PKidBIGINT
FKpost_idBIGINT
FKuser_idBIGINT
bodyTEXT
created_atTIMESTAMP
updated_atTIMESTAMP

↳ belongs to posts

↳ belongs to users

index: post_id, user_id

notifications

PKidBIGINT
FKuser_idBIGINT
typeVARCHAR(60)
dataJSON
IDXread_atTIMESTAMP NULL
created_atTIMESTAMP

↳ belongs to users

index: user_id, read_at

followers

PKidBIGINT
FKfollower_idBIGINT
FKfollowing_idBIGINT
created_atTIMESTAMP

↳ belongs to users

index: follower_id + following_id (unique), following_id

reactions

PKidBIGINT
FKuser_idBIGINT
IDXreactable_typeVARCHAR(60)
IDXreactable_idBIGINT
typeVARCHAR(20)
created_atTIMESTAMP
updated_atTIMESTAMP

↳ belongs to users

index: user_id + reactable_type + reactable_id (unique)

device_tokens

PKidBIGINT
FKuser_idBIGINT
UQtokenVARCHAR(255)
platformENUM(web,android,ios)
created_atTIMESTAMP
updated_atTIMESTAMP

↳ belongs to users

index: user_id, token (unique)

ইনডেক্সিং

প্রতিটি ফরেন কি ও যে কলামে প্রায়ই ফিল্টার/সর্ট করেন তাতে ইনডেক্স দিন।

নরমালাইজেশন

ডেটা ডুপ্লিকেট নয় — ফরেন কি দিয়ে লিংক করুন। শুধু প্রমাণিত হট-পাথে ডিনরমালাইজ।

পারফরম্যান্স

সঠিক ছোট টাইপ ব্যবহার করুন, বড় লিস্ট পেজিনেট করুন, eager loading দিয়ে N+1 এড়ান।

প্রোডাকশন স্কিমা কনভেনশন

সফট ডিলিট

ইউজার-ফেসিং কন্টেন্টে (পোস্ট, অ্যাকাউন্ট) deleted_at দিন যাতে ডিলিট রিকভার করা যায় — হার্ড ডিলিট এড়ান।

পাবলিক URL-এ স্লাগ

পাবলিক/SEO কন্টেন্টে ইউনিক slug দিন (পোস্ট, প্রোডাক্ট, ক্যাটাগরি) — পরিষ্কার, শেয়ারযোগ্য URL-এর জন্য।

পিভট টেবিল

many-to-many পিভট দিয়ে করুন (followers, taggables) + কম্পোজিট UNIQUE যাতে লিংক ডুপ্লিকেট না হয়।

পলিমরফিক রিলেশন

এক টেবিল অনেক প্যারেন্টে রিইউজ করুন (type + id) জোড়া দিয়ে — reactable, taggable। জোড়াটা একসাথে ইনডেক্স করুন।

প্রতি FK-তে ইনডেক্স

সব ফরেন কি ও যে কলামে ফিল্টার/সর্ট/জয়েন করেন তাতে ইনডেক্স — সবচেয়ে সস্তা বড় লাভ।

ধারাবাহিক বেসিক

BIGINT UNSIGNED প্রাইমারি কি, প্রতি টেবিলে timestamps, আর ইনডেক্স সহ status/enum কলাম।

কোড করার আগে স্কিমা ঠিক করুন

আপনার ডেটাবেস স্কিমা হলো অ্যাপের কঙ্কাল — ভুল হলে তার উপর বানানো প্রতিটি ফিচার সেই কষ্ট পায়। আর পরিষ্কার স্কিমা থাকলে বাকি প্রজেক্ট সহজ লাগে। এই ডেটাবেস স্কিমা প্ল্যানার একটা শক্ত প্রথম ড্রাফট দেয়: ফিচার অনুযায়ী টেবিল, যৌক্তিক ফিল্ড ও ডেটা টাইপ, প্রাইমারি ও ফরেন কি, রিলেশন (ERD) ম্যাপ, আর কোয়েরি দ্রুত রাখার ইনডেক্স। শুরুর ব্লুপ্রিন্ট হিসেবে নিন, তারপর নিজের চাহিদা অনুযায়ী টিউন করুন।

সচরাচর জিজ্ঞাসা

ডেটাবেস স্কিমা কীভাবে ডিজাইন করব?

ফিচার থেকে শুরু করুন। অ্যাপ যা যা ট্র্যাক করে — ইউজার, পোস্ট, অর্ডার, পেমেন্ট — সাধারণত প্রতিটা একটা টেবিল হয়। প্রতিটাকে প্রাইমারি কি দিন, সম্পর্কিত টেবিল ফরেন কি দিয়ে লিংক করুন, সঠিক ছোট ডেটা টাইপ বাছুন, আর যা সার্চ/জয়েন করবেন তাতে ইনডেক্স দিন। এই প্ল্যানার আপনার প্রজেক্ট ও ফিচার অনুযায়ী সেই প্রথম ড্রাফট বানিয়ে দেয়।

PK, FK, UQ ও IDX কী?

PK = প্রাইমারি কি (রো-এর ইউনিক আইডি)। FK = ফরেন কি (অন্য টেবিলের আইডির লিংক)। UQ = ইউনিক (ডুপ্লিকেট নয়, যেমন ইমেইল)। IDX = ইনডেক্স (ওই কলামে লুকআপ দ্রুত করে)। শুরুতেই এগুলো ঠিক করলে পরে কষ্টকর মাইগ্রেশন বাঁচে।

পিভট টেবিল ও পলিমরফিক রিলেশন কী?

পিভট টেবিল দুটি টেবিলকে many-to-many সম্পর্কে লিংক করে — যেমন 'followers' (follower_id, following_id) বা 'taggables'। সবসময় একটা কম্পোজিট UNIQUE দিন যাতে একই লিংক দুবার না ঢোকে। পলিমরফিক রিলেশন এক টেবিলকে অনেক প্যারেন্টে অ্যাটাচ করতে দেয় (type + id) জোড়া দিয়ে — যেমন 'reactions' টেবিল যার reactable_type/reactable_id একটা পোস্ট বা কমেন্টে পয়েন্ট করতে পারে। জোড়াটা একসাথে ইনডেক্স করুন। এই দুই প্যাটার্ন বাস্তব সোশ্যাল ও কন্টেন্ট অ্যাপ পরিষ্কার রাখে।

সত্যিই রো মুছব, নাকি সফট ডিলিট?

ইউজার যা তৈরি করতে পারে — পোস্ট, কমেন্ট, অ্যাকাউন্ট — তাতে সফট ডিলিট ভালো: deleted_at কলাম দিয়ে রো মুছে না ফেলে লুকান। এতে দুর্ঘটনাবশত ডেটা হারানো বাঁচে, রেফারেন্স অক্ষত থাকে, আর ইউজার/অ্যাডমিন রিস্টোর করতে পারে। শুধু ফেলে দেওয়ার মতো বা সংবেদনশীল ডেটা হার্ড-ডিলিট করুন। প্রোডাকশন Laravel অ্যাপে এটাই স্ট্যান্ডার্ড।

MySQL না PostgreSQL?

দুটোই চমৎকার আর এই স্কিমা দুটোতেই চলে। MySQL সহজ ও সর্বত্র; কমপ্লেক্স কোয়েরি, JSON ও ডেটা ইন্টেগ্রিটিতে PostgreSQL ভালো। ERP, মার্কেটপ্লেস ও অ্যানালিটিক্স-হেভি অ্যাপে PostgreSQL নিন। বাকি বেশিরভাগ অ্যাপে যেকোনোটাই ঠিক আছে।

সব ফ্রি টুল