בניית כלי לניהול פרויקטים באמצעות Prisma
אני בונה כלי לניהול פרויקטים שיתופי בדומה ל-Trello.
אני משתמש ב-React, Express.js, PostgreSQL ו-Socket.io. לפני שאכתוב נתיבי backend כלשהם, אני חייב לתכנן את סכימת מסד הנתונים (database schema).
הסכימה היא הבסיס. אם הסכימה שגויה, כל האפליקציה נכשלת. להלן הפירוט שלי של תכנון סכימת Prisma.
המודלים
• User: שומר שמות, אימיילים וסיסמאות. אני משתמש ב-cuid() עבור מזהים (IDs). זה יוצר מחרוזות ארוכות וייחודיות. זה עדיף על מספרים כי זה לא חושף את מספר המשתמשים שלך ב-URL.
• Project: מחזיק את שם הפרויקט והתיאור שלו. הפכתי את התיאור לאופציונלי באמצעות סימן שאלה.
• ProjectMember: זוהי טבלת קישור (junction table). היא מחברת בין Users לבין Projects. מכיוון שמשתמש אחד יכול להצטרף להרבה פרויקטים, ופרויקט אחד כולל הרבה משתמשים, צריך את טבלת הביניים הזו כדי לנהל את יחסי ה-many-to-many. הוספתי אילוץ ייחודי (unique constraint) כדי למנוע ממשתמש אחד להצטרף לאותו פרויקט פעמיים.
• Board: משימות (Tasks) נמצאות בתוך לוחות (boards). לוחות נמצאים בתוך פרויקטים. ההיררכיה הזו הופכת את ה-drag-and-drop לקל. העברת משימה בין עמודות היא בסך הכל עדכון שדה בודד.
• Task: זהו מודל הליבה. יש לו שני קשרים (relations) שונים למודל ה-User:
- משתמש שהוקצה לו (זה אופציונלי).
- יוצר (זה חובה). הייתי צריך לתת שמות מפורשים לקשרים האלו כדי ש-Prisma תדע מהו מה.
• Comment: משתמשים יכולים להשאיר תגובות על משימות. קראתי לקשר "author" במקום "user" כדי לשמור על קוד קריא.
• Notification: מודל פשוט למעקב אחר הודעות עבור משתמשים.
לקחים טכניים שנלמדו
נתקלתי בכמה שגיאות בזמן הבנייה. היזהרו מהבאים:
- שמות קשרים (Relation Names): אם שני שדות מצביעים לאותו מודל, עליכם לתת שמות לקשרים. אם לא תעשו זאת, Prisma תזרוק שגיאה.
- שדות ניתנים ל-null (Nullable Fields): אם קשר הוא אופציונלי, עליכם לשים סימן שאלה גם בשדה הקשר וגם בשדה המפתח הזר (foreign key).
- שגיאות תחביר (Syntax Errors): Prisma דורשת גרשיים כפולים עבור ערכי ברירת מחדל של מחרוזות (string defaults). גרשיים בודדים יגרמו לשגיאה.
- תחביר קשרים (Relation Syntax): תמיד השתמשו בתחביר הנכון:
@relation(fields: [localField], references: [remoteField]).
הסכימה עברה מיגרציה (migrated). בשלב הבא, אבנה את ה-backend ב-Express ואת הגדרת ה-Socket.io לעדכונים בזמן אמת.
בניית כלי לניהול פרויקטים מאפס: מתחילים עם סכמת Prisma
בניית אפליקציית תוכנה היא כמו בניית בית. עליך לבנות תשתית איתנה לפני שתוכל להתחיל להוסיף קירות וגג. בעולם פיתוח התוכנה, התשתית הזו היא סכמת מסד הנתונים שלך.
במאמר זה, נתחיל את המסע שלנו בבניית כלי לניהול פרויקטים על ידי עיצוב הסכמה באמצעות Prisma.
למה Prisma?
Prisma הוא ORM (Object-Relational Mapper) מהדור הבא, המקל על האינטראקציה עם מסד הנתונים שלך באמצעות API אינטואיטיבי ובעל Type-safety. הוא מספק הגנה על סוגי הנתונים (Type-safety), מה שמפחית שגיאות בזמן ריצה, ומציע חוויית פיתוח חלקה.
עיצוב הסכמה
הצעד הראשון בבניית כל אפליקציה הוא הבנת מבנה הנתונים. עלינו להגדיר את הישויות המרכזיות שלנו ואת הקשרים ביניהן.
להלן סכמת ה-Prisma הבסיסית שלנו:
// This is your Prisma schema file
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
projects Project[]
tasks Task[]
comments Comment[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Project {
id Int