ساخت یک ابزار مدیریت پروژه با Prisma
من در حال ساخت یک ابزار مدیریت پروژه مشارکتی شبیه به Trello هستم. من از React، Express.js، PostgreSQL و Socket.io استفاده میکنم.
اولین قدم، طرحواره (schema) پایگاه داده است. من شش مدل برای مدیریت کاربران، پروژهها، بردها (boards)، وظایف (tasks)، کامنتها و اعلانها طراحی کردهام.
در اینجا انتخابهای فنی کلیدی و درسهایی که از طراحی schema در Prisma آموختم، آورده شده است:
• استفاده از CUID برای شناسهها (IDs)
من برای تمام شناسهها از @default(cuid()) استفاده میکنم. اینها برای URLهای عمومی بهتر از اعداد ساده هستند و از حدس زدن تعداد رکوردها توسط افراد جلوگیری میکنند.
• نامگذاری صریح روابط
وقتی دو فیلد به یک مدل واحد اشاره میکنند، Prisma دچار سردرگمی میشود. برای مثال، یک وظیفه (task) دارای یک سازنده (creator) و یک مسئول (assignee) است. هر دو از نوع Users هستند. من باید این روابط را با استفاده از نامهای @relation به طور صریح نامگذاری کنم تا از خطاهای مهاجرت (migration) جلوگیری شود.
• جداول واسط (Junction Tables) برای روابط چند-به-چند
یک کاربر میتواند عضو پروژههای زیادی باشد و یک پروژه میتواند کاربران زیادی داشته باشد. من یک مدل ProjectMember برای پیوند دادن آنها ایجاد کردم. همچنین یک محدودیت یکتا (unique constraint) روی userId و projectId اضافه کردم. این کار از عضویت مجدد یک کاربر در یک پروژه جلوگیری میکند.
• سلسلهمراتب و منطق
وظایف (tasks) در پروژهها قرار ندارند، بلکه در بردها (boards) قرار میگیرند. بردها نیز در پروژهها قرار دارند. این ساختار باعث میشود قابلیت کشیدن و رها کردن (drag-and-drop) ساده شود. برای جابهجایی یک وظیفه، فقط کافی است boardId آن را بهروزرسانی کنید.
• روابط قابل تهی (Nullable)
برخی روابط الزامی و برخی اختیاری هستند. یک وظیفه حتماً باید یک سازنده داشته باشد، بنابراین از علامت سوال استفاده نمیکنم. اما مسئول (assignee) اختیاری است، پس از User? و String? استفاده میکنم. برای اینکه schema به درستی کار کند، باید هر دو حالت را لحاظ کنید.
اشتباهات رایجی که متوجه شدم:
- استفاده از تککوت (single quotes) برای مقادیر پیشفرض. Prisma به دابلکوت (double quotes) نیاز دارد.
- فراموش کردن دونقطه (colon) در نحو (syntax) ارجاعات.
- اعمال اشتباه
@default(now())روی یک فیلد ID.
در مرحله بعد، بکاند Express را خواهم ساخت و Socket.io را برای بهروزرسانیهای آنی (real-time) راهاندازی خواهم کرد.