NoSQLMongoDBRedisDynamoDBNeo4jDatabaseBackend Engineering

Day 12 - NoSQL Deep Dive - Document, Key-Value, Graph কোনটা কখন? 🗄️

June 22, 20265 min read30 Days Of Backend Engineering

একটা জিনিস চিন্তা করুন, আপনি চাইলেই সবসময় organized way-তে থাকতে পারবেন না। এটা nearly impossible। আর যদি হয়ে যান, তাহলে আপনি মানুষ থেকে robot হয়ে গেছেন। কোনোভাবে আপনার অবস্থা কিছুটা হলেও একটু এলোমেলো হবেই, এটাই normal ব্যাপার। এবং মজার ব্যাপার হচ্ছে এই এলোমেলো হওয়ার tendency-টাই আপনাকে productive হতে help করে + নতুন idea generate করতে help করে।

Same-ভাবে, সফটওয়্যার আর্কিটেকচারে সবসময় ডেটাকে আগে থেকেই রিলেশনাল টেবিলের মতো strict Schema বেঁধে ফেলা যায় না। তখন flexibility এর প্রয়োজন হয়। For example, logging data store করার ক্ষেত্রে আপনি চাইলেই strict Schema maintain করতে পারবেন না, কারণ Data-র schema time to time change হবে। এই ক্ষেত্রে flexibility এর প্রয়োজন হয়।

এই জিনিসটাই serve করে NoSQL database-গুলো। এখন অনেকে মনে করতে পারেন আমি MongoDB-কে mean করেছি। আসলে এটা ঠিক না। MongoDB একটা NoSQL database, কিন্তু এটা ছাড়াও আরও অনেক NoSQL database আছে। For example: Apache CouchDB, Amazon DocumentDB, Redis, Memcached, Apache Cassandra, Amazon DynamoDB etc। এগুলো সবই NoSQL database, এই database-গুলো কিছু specific problems solve করে।

নিচে এগুলো নিয়ে বিস্তারিত আলোচনা করা হলো।


Document Database: MongoDB, CouchDB

এই type-এর database-গুলো data-কে JSON-এর মতো করে document হিসেবে store করে। এই type database-এর benefit হচ্ছে এর schema-টা flexible। আপনি চাইলে একটা property-কে skip করতে পারেন আবার extra property-ও add করতে পারবেন। Essentially relational database-এর মতো strict না।

// MongoDB Document Example
await db.collection("products").insertOne({
  name: "Mechanical Keyboard",
  price: 85,
  attributes: { switch: "Brown", rgb: true }, // Flexible nested document
});

কখন ব্যবহার করবেন?

  • Product catalog - প্রতিটা product-এর আলাদা attributes
  • Content management - blog post, article
  • User profiles - প্রতিটা user-এর extra data আলাদা হতে পারে
  • Logging data store করার ক্ষেত্রে
**কখন করবেন না?**
  • Complex transactions দরকার
  • Data heavily relational

Key-Value Store: Redis, DynamoDB

এই type database অনেকটা HashMap data structure-এর মতো। এখানে একটা key থাকে এবং তার opposite-এ একটা value থাকে। অনেকটা JavaScript-এর object এবং Python-এর dictionary-র মতো।

# Redis Key-Value Command
SET session:user:42 '{"role": "admin"}' EX 3600;
GET session:user:42;

কখন ব্যবহার করবেন?

  • Session storage
  • Cache
  • Rate limiting counter
  • Leaderboard (Redis Sorted Set দিয়ে)
Redis নিয়ে dedicated একটা blog আসবে সেখানে এটা বিস্তারিত আলোচনা করা হবে।

Graph Database: Neo4j

এই type-এর database, graph data structure-এর মতো। এখানে সবকিছু interconnected। সবাই সবার সাথে connected থাকে। এই ধরনের database mainly social networking-এর application-এ সবচেয়ে বেশি use হয়।

// Neo4j Cypher Query: ফ্রেন্ডের ফ্রেন্ডদের খুঁজে বের করা
MATCH (u:User {name: "Sohan"})-[:FRIENDS_WITH]->()-[:FRIENDS_WITH]->(fof)
RETURN fof.name;

কখন ব্যবহার করবেন?

  • Social networks (Friend of a friend)
  • Relationship-based Recommendation engines
  • Fraud detection এবং Knowledge Graphs
নোট: আধুনিক AI ও LLM অ্যাপ্লিকেশনের semantic search বা recommendation engine-এর জন্য Graph DB-র চেয়ে **Vector Database** যেমন Pinecone, Qdrant, pgvector বেশি জনপ্রিয়। তবে Knowledge Graph তৈরিতে Graph DB ব্যবহৃত হয়।

Wide-Column / Column-Family Store: Cassandra, ScyllaDB 🏛️

ট্রেডিশনাল রিলেশনাল ডাটাবেসে প্রতিটি রো (Row)-তে ফিক্সড কলাম থাকে। কিন্তু Wide-Column ডাটাবেসে প্রতিটি রো-তে আলাদা আলাদা কলাম ও ডাইনামিক ডেটা থাকতে পারে। এটি রিলেশনাল টেবিল এবং কি-ভ্যালুর একটি হাইব্রিড রূপ।

-- CQL (Cassandra Query Language)
CREATE TABLE sensor_data (
    device_id uuid,
    recorded_at timestamp,
    temperature float,
    PRIMARY KEY (device_id, recorded_at)
);

কখন ব্যবহার করবেন

  • Extreme Write-Heavy Systems: প্রতি সেকেন্ডে লাখ লাখ ডাটা write করার জন্য (যেমন: IoT সেন্সর ডেটা, ফিন্যান্সিয়াল টিক্স)।
  • Massive Time-Series Data: সময়ের ক্রমানুসারে লগ বা metrics সংরক্ষণ করতে।
**কখন ব্যবহার করবেন না**
  • ঘনঘন relational JOIN বা complex aggregation query দরকার হলে।

Summary

Database TypeBest ExamplesPrimary Use CaseScaling / Strength
**Document**MongoDB, CouchDBProduct catalogs, CMS, JSON dataFlexible schema, rich queries
**Key-Value**Redis, DynamoDBCaching, session managementMicrosecond latency, simple lookups
**Wide-Column**Cassandra, ScyllaDBIoT sensors, analytics, massive writesLinear write scalability, High Availability
**Graph**Neo4j, Amazon NeptuneSocial networks, fraud detectionFast complex relationship traversal

বটম লাইন

ওপরের এই database ছাড়াও আরও অনেক আছে। তাদের dedicated docs আছে। এই database সবগুলোর সম্পর্কে জানুন। আপনার requirement বুঝুন তারপর choose করুন। NoSQL মানেই MongoDB না, আরও অন্য database-ও হতে পারে।

এখানে একটা বিষয় আছে—আপনি চাইলেই খুব সহজেই NoSQL database সিলেক্ট করে নিতে পারেন। তবে আপনার Database Design করতে জানতে হবে (যদিও না জানলেও কাজ করা যায়, প্রবলেম হয় না)। কিন্তু একটা সময় যেয়ে আপনার Database এত complex হয়ে যাবে, দেখা গেল সিম্পল একটা query রান করতে গেলেও O(n^2) time complexity হয়ে যাচ্ছে। তাই NoSQL-এর ক্ষেত্রেও Database Design জানাটা প্রয়োজন।

আপনার project-এ কোন NoSQL database ব্যবহার করছেন? কেন choose করেছিলেন? কমেন্টে শেয়ার করুন! 👇