বাংলা আর্টিকেল:Learn MERN Stack By Create Real-Estate Project -Part_2

বাংলা আর্টিকেল:Learn MERN Stack By Create Real-Estate Project -Part_2

(Learn Prisma & MongoDB) ->Create Real-estate Management Full Stack Project To Learn React, NodeJs, MongoDB, Prisma And More Web Tools.

তোমাদের সাথে এর আগের আর্টিকেল এ অনেক কথা হয়েছে। আশাকরছি আমার বকবক তোমাদের ভালো লাগছে। কমেন্ট সেকশন তেমন রেস্পন্স দিচ্ছে না এটা একটা প্রব্লেম!! তবে

তোমাদের ফিডব্যাক আমার জন্য খুব প্রয়োজনীয়। আমি আমার ভুলগুলি থেকে শিখতে চাই। চাই, তোমরা আমাকে ,আমার চোখে আঙ্গুল দিয়ে ভুল ধরিয়ে দাও।

যাইহোক - Hey Script_Slingers,

আজকে আমাদের Mern Real-estate project এর part-২ কাভার করতে যাচ্ছি।

এই পর্বে তুমি জানতে পারবে :

Table of Content :

  • Introduction And Recap

  • What Is MongoDB

  • What Is Prisma

  • Setting Up Prisma and MongoDB Connection

  • Defining Data Models with Prisma

  • Simple CRUD Project in Prisma

  • Back To The Project

  • Conclusion

Introduction And Recap:

আমরা গত পর্বে তেমন কিছুই করিনি, RealEstate-Management ফোল্ডার create করেছি। যার মেইন দুইটা ফোল্ডার ছিল client এন্ড server । শুরু করেছি সার্ভার বা ব্যাকএন্ড দিয়ে ,যেখানে আমাদের টার্গেট api বানান।

এর পাশাপাশি তুমি জেনে গেছ ,কিভাবে npm init এর মাধ্যমে প্রজেক্ট ইনিশিয়ালাইজ করতে হয়। ডিপেন্ডেন্সি কি? এবং আমরা কি কি ডিপেন্ডেন্সি ব্যবহার করছি ও কিভাবে তা ইনস্টল করতে হয়। এছাড়া index.js যা আমাদের মেইন এন্ট্রি পয়েন্ট সেখানে সবগুলো ডিপেন্ডেন্সি ইম্পোর্ট করে, nodejs ফ্রেমওয়ার্ক এক্সপ্রেস এর মেথড, app.listen() এর মাধ্যমে একটা সার্ভার রান করেছি ।

আজকে আমরা, MongoDB ও Prisma দিয়ে প্রথমে ছোট্ট একটা CRUD প্রজেক্ট বানাব এবং পরবর্তীতে তোমার কাজ থাকবে RealEstate-Management প্রজেক্ট এর জন্য MongoDB ও Prisma মডেল ইমপ্লিমেন্ট করা ও ডাটাবেস কানেক্ট করা। এতেকরে Prisma আমাদের কাছে ক্লিয়ার হয়ে যাবে।

তুমি এখন যা করবে ,আমাদের RealEstate-Management এর একটা ডুপ্লিকেট বা কপি বানাবে। নাম দিতে পার prisma-crud এবং prisma-crud ফোল্ডার এর মধ্যে থাকা server ফোল্ডার টি তোমার কোড এডিটর এ ওপেন করবে। টার্মিনাল থেকে server ফোল্ডার এ যাবে এবং npm start কমান্ড দিয়ে চেক করবে কোড ঠিকঠাক কাজ করে কিনা।

সব ঠিক থাকলে ,আউটপুট আসার কথা :

//Output----------------------
yourPcPath/prisma-crud/server$ npm start

> server@1.0.0 start
> nodemon index.js

[nodemon] 3.0.1
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,cjs,json
[nodemon] starting `node index.js`
Server is running on 3000

All Right, Let's Start :

ওয়েব নিয়ে যখন কাজ করবা মনেরাখবা ,এখানে জাস্ট দুইটাই ফেস হয় ক্লায়েন্ট ও সার্ভার। ক্লায়েন্ট রিকোয়েস্ট পাঠাবে সার্ভার এ ,এবং server রেসপন্স ব্যাক করবে।

আবার ,এই সার্ভার ও ক্লায়েন্ট ফেস চেঞ্জ হতে পারে রিকোয়েস্ট এর উপর ভিত্তি করে।

যেমন ধর ,React ( ক্লায়েন্ট ) থেকে Express ( সার্ভার ) এ কোন রিকোয়েস্ট গেলো এবং এক্সপ্রেস সেটার রেস্পন্স ব্যাক করল, সেক্ষেত্রে Express হচ্ছে React এপ্লিকেশন এর ব্যাকএন্ড।

আবার ধর , এক্সপ্রেস (server ) ডাটাবেস (mongodb ) কে কোন রিকোয়েস্ট দিল এবং mongodb সেই রেসপন্স ব্যাক করল। এখানে mongodb হচ্ছে ব্যাকএন্ড এবং এক্সপ্রেস হচ্ছে ওই ডাটাবেসের ফ্রন্টএন্ড ।

SO,

What Is MongoDB:

mongodb একটা ডাটাবেস সিস্টেম সেটা তো আমরা সবাই জানি।

মানে আমরা সচর আঁচড় যে বলি, "NoSQL" ( ফুল ফর্ম "Not Only SQL") ডাটাবেস সিস্টেম যা ট্রেডিশনাল relational databases, যেমন , SQL (ফুল ফর্ম "Structured Query Language" ) এর table ,row ,columns approach ফলো করে না।

বরং document-oriented মডেল approach ফলো করে।

একটু ভেঙে বলা যাক :

মনেকর ,তোমার কাছে কিছু ডাটা আছে, যা আসছে সোশ্যাল প্লাটফর্ম বা ধর facebook থেকে এবং তুমি ট্রেডিশনাল ডাটাবেস ফলো করে table , row এবং columns আকারে ডাটা গুলি স্টোর করবা।

  Table:
        column column      column
       | name | age  |      email       |
  row  | alice| 28   | alice@example.com|
  row  | Bob  | 35   |   bob@example.com|

ধরো এইটাই একটা টেবিল।

কিন্তু, MongoDB ডাটাবেস এ তুমি টেবিল এর পরিবর্তে পাবে collections ,আর rows and columns এর পরিবর্তে পাবে documents

এই document হল kind of like a big JSON object.

যা দেখতে এমন :

//collection like Table
[
  //document like column and row
{
    "name": "Alice",
    "age": 28,
    "email": "alice@example.com"
  },
//document like column and row
  {
    "name": "Bob",
    "age": 35,
    "email": "bob@example.com"
  }
]

তবে এইটাকে json ডাটার মত মনেহলেও এটা মূলত BSON ।

এই BSON হল "Binary JSON" মানে জেসনই তবে বাইনারি ফরমেট এ।

তুমি বুজছো আশাকরি , জাস্ট মাথায় রাখবা যে MONGODB ডাটাবেস এ ডাটা , BSON আকারে থাকে ।আর স্কেলেবিলিটি ও বিগ ডাটা হ্যান্ডেল করার জন্য এই ফরমেট পারফেক্ট কাজ করে । তবে BSON ফরমেট এ ট্রাডিশনাল রিলেসন মেইনটেইন করা ঝামেলার, মানে ফরেন কীয় টাইপ রিলেসন।

MongoDB schema:

স্কিমা হল একটা স্ট্রাকচার বা বাংলায় বললে হয় ছাঁচ। ডাটা গুলোকে অর্গানাইজ করে ডাটাবেস এ সংরক্ষণ করার যে প্রিডিফাইন উপায়, এটাই স্কিমা।

কথা হচ্ছে MongoDB কিন্তু ,"স্কিমা লেস " ডাটাবেস। এরা নিজেদের স্কিমা টাইপ গন্ডির মধ্যে আটকে রাখতে চায় না । বরং অবজেক্ট এর মত হওয়ায় ,mongodb আরো বেশি ফ্লেক্সিবিলিটি অফার করে ,নিজেদের দাবি করে more ফ্লেক্সিবল ও ডায়নামিক স্কিমা প্রোভাইডার হিসেবে।

মানে ,MongoDB ডেভেলপারদের বলে ,ভাই তোমার আগে স্ট্রাকচার বলার কি দরকার ,তোমার কাছে কালেকশন আছে তুমি সরাসরি ফিল্ড আর ডাটা টাইপ বা ভ্যালু বলে দাও।

আমি তোমায় ডকুমেন্ট এ on the fly ডাটা add or remove করার সুবিধা দিচ্ছি জাস্ট কোড কর আর ডাটা অ্যাড কর। planti অফ data types যেমন strings, numbers, dates, arrays, and nested documents নিয়ে মিক্স করে অ্যাড করতে পারবা , so মিক্স এন্ড প্লে।

সেই পূরণ ট্রেডিশনাল রিলেশনাল ডাটাবেস এর দরকার নাই বেটার তুমি embedding ডকুমেন্ট অথবা IDS রেফারেন্স এর মাধ্যমে রিলেসন মেইনটেইন কর । mongodb ডেভেলপারদের এনফোর্স করে এম্বেডেড উপায়ে ডাটাবেস হ্যান্ডেল করার ।

Schema-less is Problem For Developer:

কিন্তু এই স্কিমা লেস হওয়াতে প্রবলেম হয় ডেভেলপারদের । তারা on the fly ডাটা চেঞ্জ করে ফেলে,stricked কোন টাইপ ডিফাইন থাকে না বলে type error হয়ে যায় । এমনকি রিলেসন মেইনটেইন করার ক্ষেত্রে এই ভার্সাটাইলিটি bug প্রডিউস করতে পারে।

তাই ব্যাকএন্ড ডেভেলপার রা mongodb এর সাথে mongoose স্কিমা ব্যবহার করে কাজ চালাত। mongoose হলো mongodb স্কিমা ডিফাইনার । এবং এর ব্যবহার শুধু মাত্র mongodb এর সাথেই সীমাবদ্ধ ছিল।
তুমি, এই লাইন এ relate করতে পার এভাবে ,যে prisma also a schema definer but not only for mongodb তুমি sql,postgresql,mysql এমন আরো অনেক ডাটাবেস সিস্টেম এর সাথে একই ভাবে কাজ করতে পার। সিঙ্গেল ডাটাবেস ফোকাস না হওয়ায় ও মাল্টিপল ডাটাবেসের সাথে একই ভাবে কাজ করার ফলে, prisma এত পপুলার এবং বেস্ট অল্টারনেট অফ mongoose হচ্ছে দিন দিন ।

💬
তুমি নিশ্চই বুজতে পারছো Prisma এর গুরুত্ব কেন এত । কমেন্ট করে জানাও।

What Is Prisma:

Prisma নিজেকে দাবী করে মর্ডান ডাটাবেস টুলকিট হিসাবে। তুমি as ডেভেলপার ইন্টারাক্টিভলি ডাটাবেসের সাথে কাজ করতে পার from the codebase।

আমরা প্রায়ই শুনেথাকি ORM , এই "ORM (Object-Relational Mapping)" টার্মটি মূলত একটি প্রোগ্রামিং টেকনিক যা প্রোগ্রামের অবজেক্ট-ওরিয়েন্টেড approch ব্যবহার করে রিলেশনাল ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করতে সাহায্য করে।

ORM দিয়ে , তুমি তোমার অ্যাপ্লিকেশনের কোড লিখার সময় ডাটাবেস রেকর্ডগুলি কে এমনভাবে অবজেক্ট বা ক্লাস হিসেবে বলেদিতে পারো যেন তুমি তোমার প্রোগ্রামিং ভাষায় কাজ করছো। Prisma এই ORM টার্মস applay করে তাদের ওয়ার্কফ্লো আরো ইউসার ফ্রেন্ডলি করেছে ।

ভেঙেচুরে দেখি কি কি ফিচার সার্ভ করে prisma যা আমাদের আগের কথা গুলিকে ডিফেন্স করবে :

Intuitive Data Model: Prisma একটা ফ্রেন্ডলি ডাটা মডেল / স্কিমা ডিফাইন করতে দেয়। তুমি তোমার ডাটাবেস এর স্ট্রাকচার কেমন হবে ,কে কার সাথে রিলেসন মেইনটেইন করবে এসব খুব রিডেবল way তে বলদিতে পার।

আর আমরা জানি কোড রিডেবল হওয়া জরুরি।

Automated Migrations: Prisma তার abstract অটোমেশন migrating প্রসেস এর মাধ্যমে এপ্লিকেশন থেকেই ডাটাবেস স্কিমা জেনারেট করে। এতেকরে যেমন টাইম বাঁচে , সাথে ডাটা স্ট্রাকচার sync থাকে কোড চেঞ্জ হওয়ার সাথে সাথে।

Type-Safety: তুমি যখন ডাটা মডেল ডিফাইন করবা for ডাটাবেস, একটা স্ট্রং টাইপ query বিল্ডার্স বলে দিতেপারবে ।

এর ফলে unwanted type error থেকে আমরা বেঁচে যাব। যেমনটা typescrint আমাদের হেল্প করে। এইসব সুবিধা একজন ডেভেলপার এর হাজার হাজার সেকেন্ট বাঁচাতে পারে এবং গুড ডেভেলপার এক্সপেরিয়েন্স provide করে।

Create MongoDB Atlas Database:

Step 1: Set Up MongoDB Atlas Account

  1. Go to the MongoDB Atlas website: mongodb.com/cloud/atlas

  2. Sign up for an account or log in if you already have one.

  3. Once logged in, click the "Build a Cluster" button to create a new MongoDB cluster.

  4. Select Shared ,aws,asia and click create cluster .

Step 2: Create a Database User

  1. In the MongoDB Atlas dashboard, click on "Database Access" in the left sidebar.

  2. Click the "ADD NEW DATABASE USER" button.

  3. Enter a username and password for the user.

  4. Assign appropriate roles (e.g., read and write access) to the user for the desired database.

Step 3: Create a Cluster and Database

  1. In the MongoDB Atlas dashboard, click on "Clusters" in the left sidebar.

  2. Click the "Build a Cluster" button and follow the prompts to configure your cluster.

  3. Once the cluster is created, click the "Collections" button under the "Database" section.

  4. Click the "Create Database" button to create a new database.

  5. Enter a database name and select the desired configuration options.

OR

তুমি নিচের এই ভিডিও দেখো , কিভাবে Mongodb এটলাস ডাটাবেস create করতে হয় বুঝে যাবে আশা করি। Starting point এবং Ending point দেখতে পারো। অথবা পুরো ভিডিও দেখো। এটা অনেক ইনফরমেশন দিবে mongoDb সম্পর্কে।

Starting Point: https://www.youtube.com/watch?v=084rmLU1UgA&t=38s

Ending Point: https://www.youtube.com/watch?v=084rmLU1UgA&t=201s

Note : ডিটেলস লিখতে গেলে আর্টিকেল অনেক বড় হয়ে যাবে। তাছাড়া atlas use করে ডাটাবেস create করা তুমি নিশ্চই যান।

Setting Up Prisma :

আমাদের prisma-crud ফোল্ডার এ অলরেডি ডিপেন্ডেন্সি হিসেবে prisma ইনস্টল করা আছে।

যদি না থাকে তবে নিচের কমেন্ট টার্মিনাল এ চালালে ইনস্টল হবে ডিপেন্ডেন্সি হিসেবে :

npm install prisma

এরপর ,তোমাকে জাস্ট npx কমান্ড টার্মিনাল এ চালিয়ে invoke করতে হবে :

//~/Documents/prisma-crud/server$ 
npx prisma

Next, নিচের কমান্ড টার্মিনাল এ চালালে Prisma ফোল্ডার ও .env ফাইল create করে দিবে এবং Prisma ফোল্ডার এর মধ্যে তুমি schema.prisma ফাইল পাবে :

//~/Documents/prisma-crud/server$ 
npx prisma init

then, schema.prisma ওপেন করলে তুমি নিচের কোড পাবে যা db কানেকশন এন্ট্রী পয়েন্ট :

// schema.prisma

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mongodb"
  url      = env("DATABASE_URL")
}

এবার দেখে নেই কার কি কাজ :

generator client: এই section ব্যবহার হয় generator configure করার জন্য, যা generate করে Prisma client আমাদের application এ । আর provider specifies করে, generator অবশ্যই JavaScript language ব্যবহার করে Prisma client create করবে।

datasource db: section টি ডিফাইন করে এপ্লিকেশন এর ডাটা সোর্স , আমাদের ক্ষেত্রে যা mongodb ।

Note: তুমি provider = "ctrl+space" প্রেস করলে vs কোড থেকে দেখতে পাবে কি কি প্রোভাইডার আরো আছে।

provider specifies that আমরা mongodb database কানেক্ট হয়েছে এবং url পেরামিটার contain ডাটাবেস কানেক্শন URL, যা আমরা পাই .env DATABASE_URL environment variable থেকে ।

.env ফাইল এ পাবে :

//.env 

DATABASE_URL="mongodb+srv://<username>:<password>@cluster0.z0jkxgq.mongodb.net/<databasename>?retryWrites=true&w=majority"

মূলত DATABASE_URL ভ্যারিয়েবল এ তোমার mongogb কানেকশন url provide করবে।

যখন আমরা connection string আমাদের application এ ব্যবহার করব , তোমাকে জাস্ট replace করতে হবে <username>, <password>, and <databasename> with the actual values ।

connection স্ট্রিং MongoDB Atlas এ কমনলি ব্যবহার হয়,আর তুমি তো জানোই mongoDB এটলাস cloud-based MongoDB service । যেহেতু এটলাস এ অনেক গুলি ডাটাবেস থাকতে পারে তাই ডাটাবেস নাম এর উপর ভিত্তি করেই স্পেসিফিক ডাটাবেস কানেক্ট করবে।

Let's Learn Prisma Model:

Prisma model হচ্ছে blueprint । যা ডিফাইন করবে আমাদের এপ্লিকেশন এর ডাটাবেস দেখতে কেমন হবে, এটা তুমি ইতিমধ্যে জেনেগেছো। আমরা prisma তে মডেল ডিফাইন করতে পারি জাভাস্ক্রিপ্ট অবজেক্ট এর মত করে ,আবার এক একটা মডেল এর অনেক গুলো Field থাকতে পারে।

Fields রিপ্রেসেন্ট করে ডিফারেন্ট টাইপ অফ data এবং এই ডাটাগুলির বিভিন্ন data type হতে পারে ।যেমন , strings, numbers, array এমন আরো।

//schema.prisma
//rest of the code 
model Post {
  id     String 
  title  String
  userId String 
}

এপর্যায়ে ,কোনটাকে কি বলে জেনে নাই :

  • Model : উপরের code এ "Post" নামে মডেল ডিফাইন করেছি । যা mongoDB তে তুমি কালেকশন হিসেবে যান। আমরা, এমন অনেক মডেল prisma তে ডিফাইন করতে পারি, এবং প্রত্যেক মডেল বা কালেকশন এর ইনস্ট্যান্স, ওই মডেলের ডকুমেন্ট রিপ্রেসেন্ট করে। prisma তে Model এর নামের পূর্বে model কীওয়ার্ড ব্যবহার করতে হয়।

  • Fields : এক্সাম্পল এ Post নামে আমরা, কালেকশন বা মডেল ডিফাইন করেছি এর আবার তিনটা fields আছে খেয়াল করে দেখো । "id," "title," এবং "userId" প্রত্যেকের সামনে আমরা এর data type বলেদিয়েছি।

  • Relationship : আমি আগেই উল্লেখ করেছি Prisma তে তুমি মাল্টিপল model ডিফাইন করতে পার। এবং প্রত্যেকটি মডেল একে অন্যের সাথে রিলেসন স্টাবলিস্ট করতে পারে fileld ও key এর উপর ভিত্তি করে । যেমন ধর ,One-to-One Relationship, One-to-Many Relationship এবং Many-to-Many Relationship।

  • Attributes : Attributes বেসিক্যালি field গুলির additional behavior ডিফাইন করে ,যেমন ধর, id,name,title এই ফিল্ড গুলির কে primary keys হবে ,কে auto-increment হবে , কে mapping করবে database type এসব আমরা এট্রিবিউট দিয়ে বলে দিতে পারি ।

  • type-safety : Prisma যখন ডাটা জেনারেট করে TypeScript এর টাইপ রুলস ফলো করে মডেল গুলি সাজায় ,যা ডাটাবেসের type-safe access strikly হ্যান্ডেল করে। এর ফলে খুব দ্রুত error ক্যাচ করতে সক্ষম ।

  • Prisma Client with Prisma models : Prisma Client একটা অবজেক্ট যা , অনেকগুলি মেথড provide করে । কোডবেস এ ডিফাইন করা মডেল এর উপর ভিত্তি করে ডাটাবেস এর সাথে ইন্টারেক্ট করতে সাহায্য করে মেথড গুলি ।

    এটি মূলত মেথড গুলির মাধ্যমে CRUD operations চালাতে দেয়।

    Prisma Client Methods :

    • create: Insert new records into the database.

    • findUnique: Retrieve a single record by a unique identifier.

    • findMany: Retrieve multiple records based on criteria.

    • findFirst: Retrieve the first record that matches certain conditions.

    • update: Modify existing records by specifying the conditions and updated data.

    • delete: Remove records from the database based on conditions.

    • Relation methods: Access related data in associated tables.

Conclusion:

এই লেখাটা লিখতে গিয়ে দেখসি কিছু বাদ দিয়ে আগানো ঠিক হবে না। অলরেডি অনেক বড় হয়ে গেছে। তার উপরে Relationship এর ডিটেলস না গেলে prisma শিখে আসলে কোন লাভ নেই। শুধু prisma না, One-to-One Relationship, One-to-Many Relationship এবং Many-to-Many Relationship এই বিষয় গুলোতে যত দখল থাকবে কমপ্লেক্স ডাটাবেস ও এপ্লিকেশন বানানো ততটাই সহজ হবে।

তাই ,আরো একটা ডেডিকেটেড পর্ব Prisma কে দিতে চাই।

  • Relationship

  • Defining Data Models with Prisma

  • Simple CRUD Project in Prisma

এই টপিক গুলি চেষ্টা করব পরবর্তী পার্ট এ কভার করার।

তবে তার আগে ,আমাকে জানতে হবে, তোমরা আমার লেখা ক্লিয়ার বুজতে পারছো কিনা !!

কোথাও ইম্প্রোভ লাগবে কিনা।


আমি জানি ,প্রজেক্ট করতে গিয়ে অনেক লম্বা টপিক নিয়ে আগাচ্ছি।

কিন্তু আমি আশা রাখি তোমাদের স্ট্রং একটা বেসমেন্ট এর মাধ্যমে চলে আসবে।

#devTj #tanvir_mehedi #Prisma