بناء أداة لإدارة المشاريع باستخدام Prisma
أقوم ببناء أداة تعاونية لإدارة المشاريع تشبه Trello. أستخدم React و Express.js و PostgreSQL و Socket.io.
الخطوة الأولى هي مخطط قاعدة البيانات (database schema). لقد صممت ستة نماذج (models) للتعامل مع المستخدمين، والمشاريع، واللوحات (boards)، والمهام، والتعليقات، والإشعارات.
إليكم الخيارات التقنية والدروس المستفادة الرئيسية من تصميم مخطط Prisma الخاص بي:
• استخدام CUID للمعرفات (IDs)
أستخدم @default(cuid()) لجميع المعرفات. هذه المعرفات أفضل من الأرقام البسيطة في روابط URL العامة، فهي تمنع الأشخاص من تخمين عدد السجلات التي لديك.
• أسماء العلاقات الصريحة (Explicit Relation Names)
عندما يشير حقلان إلى نفس النموذج، يصاب Prisma بالارتباك. على سبيل المثال، تحتوي المهمة على منشئ (creator) ومُكلف (assignee)، وكلاهما من نوع Users. يجب عليّ تسمية هذه العلاقات صراحةً باستخدام أسماء @relation لتجنب أخطاء التهجير (migration errors).
• جداول الربط (Junction Tables) لعلاقات "متعدد إلى متعدد"
يمكن للمستخدم أن ينتمي إلى مشاريع عديدة، ويمكن للمشروع أن يضم مستخدمين كثر. لقد أنشأت نموذج ProjectMember للربط بينهما، وأضفت قيداً فريداً (unique constraint) على userId و projectId. هذا يمنع المستخدم نفسه من الانضمام إلى المشروع مرتين.
• التسلسل الهرمي والمنطق
المهام لا توجد داخل المشاريع مباشرة، بل توجد داخل اللوحات (boards)، واللوحات توجد داخل المشاريع. هذا يجعل عملية السحب والإفلات (drag-and-drop) بسيطة؛ فمن أجل نقل مهمة، كل ما عليك فعله هو تحديث boardId الخاص بها.
• العلاقات القابلة للإلغاء (Nullable Relations)
بعض العلاقات مطلوبة، وبعضها اختياري. يجب أن يكون للمهمة منشئ، لذا لا أستخدم علامة الاستفهام. أما المُكلف (assignee) فهو اختياري، لذا أستخدم User? و String?. يجب تضمين كليهما لكي يعمل المخطط بشكل صحيح.
الأخطاء الشائعة التي وجدتها:
- استخدام علامات الاقتباس المفردة للقيم الافتراضية، بينما يتطلب Prisma علامات اقتباس مزدوجة.
- نسيان النقطتين الرأسيتين في صيغة المراجع (references syntax).
- تطبيق
@default(now())على حقل معرف (ID) عن طريق الخطأ.
بعد ذلك، سأقوم ببناء الخلفية (backend) باستخدام Express وإعداد Socket.io للتحديثات الفورية (real-time updates).