Prisma দিয়ে একটি প্রজেক্ট ম্যানেজমেন্ট টুল তৈরি করা
আমি Trello-এর মতো একটি কোলাবোরেটিভ প্রজেক্ট ম্যানেজমেন্ট টুল তৈরি করছি।
আমি React, Express.js, PostgreSQL এবং Socket.io ব্যবহার করছি। কোনো ব্যাকএন্ড রুট লেখার আগে, আমাকে ডাটাবেস স্কিমা ডিজাইন করতে হবে।
স্কিমা হলো ভিত্তি। স্কিমা ভুল হলে পুরো অ্যাপটি ব্যর্থ হবে। নিচে Prisma স্কিমা ডিজাইনের আমার বিশ্লেষণ দেওয়া হলো।
মডেলসমূহ
• User: নাম, ইমেল এবং পাসওয়ার্ড সংরক্ষণ করে। আমি ID-র জন্য cuid() ব্যবহার করি। এটি দীর্ঘ এবং ইউনিক স্ট্রিং তৈরি করে। এটি সংখ্যার চেয়ে ভালো কারণ এটি URL-এ আপনার ইউজার সংখ্যা প্রকাশ করে না।
• Project: প্রজেক্টের নাম এবং বিবরণ ধারণ করে। আমি একটি প্রশ্নবোধক চিহ্ন ব্যবহার করে বিবরণটিকে (description) অপশনাল করেছি।
• ProjectMember: এটি একটি জাংশন টেবিল (junction table)। এটি User-কে Project-এর সাথে যুক্ত করে। যেহেতু একজন ইউজার অনেক প্রজেক্টে যোগ দিতে পারেন এবং একটি প্রজেক্টে অনেক ইউজার থাকতে পারেন, তাই এই many-to-many রিলেশনটি ম্যানেজ করার জন্য এই মাঝখানের টেবিলটি প্রয়োজন। একই ইউজার যাতে দুবার একটি প্রজেক্টে যোগ দিতে না পারেন, সেজন্য আমি একটি ইউনিক কনস্ট্রেইন্ট (unique constraint) যোগ করেছি।
• Board: টাস্কগুলো বোর্ডের ভেতরে থাকে। বোর্ডগুলো প্রজেক্টের ভেতরে থাকে। এই হায়ারার্কি (hierarchy) ড্র্যাগ-অ্যান্ড-ড্রপ করা সহজ করে তোলে। এক কলাম থেকে অন্য কলামে টাস্ক সরানো মানে কেবল একটি ফিল্ড আপডেট করা।
• Task: এটি মূল মডেল। User মডেলের সাথে এর দুটি ভিন্ন রিলেশন রয়েছে:
- একজন অ্যাসাইন করা ইউজার (এটি অপশনাল)।
- একজন ক্রিয়েটর (এটি রিকোয়ার্ড)। Prisma যাতে বুঝতে পারে কোনটি কী, সেজন্য আমাকে এই রিলেশনগুলোর নাম স্পষ্টভাবে দিতে হয়েছে।
• Comment: ইউজাররা টাস্কের ওপর কমেন্ট করতে পারেন। কোডটি সহজে পড়ার যোগ্য রাখার জন্য আমি রিলেশনটির নাম "user"-এর পরিবর্তে "author" দিয়েছি।
• Notification: ইউজারদের মেসেজ ট্র্যাক করার জন্য একটি সাধারণ মডেল।
অর্জিত কারিগরি শিক্ষা
এটি তৈরির সময় আমি বেশ কিছু ভুলের সম্মুখীন হয়েছি। এই বিষয়গুলো খেয়াল রাখবেন:
- Relation Names: যদি দুটি ফিল্ড একই মডেলকে নির্দেশ করে, তবে আপনাকে অবশ্যই রিলেশনগুলোর নাম দিতে হবে। তা না হলে Prisma এরর (error) দেখাবে।
- Nullable Fields: যদি কোনো রিলেশন অপশনাল হয়, তবে আপনাকে রিলেশন ফিল্ড এবং ফরেন কি (foreign key) ফিল্ড—উভয় ক্ষেত্রেই একটি প্রশ্নবোধক চিহ্ন দিতে হবে।
- Syntax Errors: স্ট্রিং ডিফল্ট (string defaults)-এর জন্য Prisma-তে ডাবল কোটেশন (double quotes) প্রয়োজন। সিঙ্গেল কোটেশন ব্যবহার করলে কাজ করবে না।
- Relation Syntax: সবসময় সঠিক সিনট্যাক্স ব্যবহার করুন:
@relation(fields: [localField], references: [remoteField])।
স্কিমা এখন মাইগ্রেট করা হয়েছে। এরপর, আমি রিয়েল-টাইম আপডেটের জন্য Express ব্যাকএন্ড এবং Socket.io সেটআপ তৈরি করব।