𝗕𝘂𝗶𝗹𝗱𝗶𝗻𝗴 𝗮 𝗣𝗿𝗼𝗷𝗲𝗰𝘁 𝗠𝗮𝗻𝗮𝗴𝗲𝗺𝗲𝗻𝘁 𝗧𝗼𝗼𝗹 𝘄𝗶𝘁𝗵 𝗣𝗿𝗶𝘀𝗺𝗮
ನಾನು Trello ನಂತಹ ಸಹಯೋಗದ (collaborative) project management tool ಅನ್ನು ನಿರ್ಮಿಸುತ್ತಿದ್ದೇನೆ.
ನಾನು React, Express.js, PostgreSQL ಮತ್ತು Socket.io ಅನ್ನು ಬಳಸುತ್ತಿದ್ದೇನೆ. ಯಾವುದೇ backend routes ಬರೆಯುವ ಮೊದಲು, ನಾನು database schema ಅನ್ನು ವಿನ್ಯಾಸಗೊಳಿಸಬೇಕು.
Schema ಎಂಬುದು ಅಡಿಪಾಯವಿದ್ದಂತೆ. Schema ತಪ್ಪಾಗಿದ್ದರೆ, ಇಡೀ ಆ್ಯಪ್ ವಿಫಲವಾಗುತ್ತದೆ. Prisma schema ವಿನ್ಯಾಸದ ನನ್ನ ವಿವರಣೆ ಇಲ್ಲಿದೆ.
𝗧𝗵𝗲 𝗠𝗼𝗱𝗲𝗹𝘀
• User: ಹೆಸರುಗಳು, ಇಮೇಲ್ಗಳು ಮತ್ತು ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ. ನಾನು IDs ಗಾಗಿ cuid() ಬಳಸುತ್ತೇನೆ. ಇದು ದೀರ್ಘವಾದ, ವಿಶಿಷ್ಟವಾದ (unique) ಸ್ಟ್ರಿಂಗ್ಗಳನ್ನು ರಚಿಸುತ್ತದೆ. ಇದು ಸಂಖ್ಯೆಗಳಿಗಿಂತ ಉತ್ತಮವಾಗಿದೆ ಏಕೆಂದರೆ ಇದು URL ನಲ್ಲಿ ನಿಮ್ಮ ಬಳಕೆದಾರರ ಸಂಖ್ಯೆಯನ್ನು ಬಹಿರಂಗಪಡಿಸುವುದಿಲ್ಲ.
• Project: ಪ್ರಾಜೆಕ್ಟ್ ಹೆಸರು ಮತ್ತು ವಿವರಣೆಯನ್ನು ಹೊಂದಿರುತ್ತದೆ. ನಾನು ಪ್ರಶ್ನಾರ್ಥಕ ಚಿಹ್ನೆಯನ್ನು ಬಳಸಿ ವಿವರಣೆಯನ್ನು (description) ಐಚ್ಛಿಕವಾಗಿ (optional) ಮಾಡಿದ್ದೇನೆ.
• ProjectMember: ಇದು ಒಂದು junction table ಆಗಿದೆ. ಇದು Users ಅನ್ನು Projects ಗೆ ಲಿಂಕ್ ಮಾಡುತ್ತದೆ. ಒಬ್ಬ ಬಳಕೆದಾರನು ಅನೇಕ ಪ್ರಾಜೆಕ್ಟ್ಗಳಿಗೆ ಸೇರಬಹುದು ಮತ್ತು ಒಂದು ಪ್ರಾಜೆಕ್ಟ್ನಲ್ಲಿ ಅನೇಕ ಬಳಕೆದಾರರಿರಬಹುದು, ಆದ್ದರಿಂದ ಈ many-to-many ಸಂಬಂಧವನ್ನು ನಿರ್ವಹಿಸಲು ನಿಮಗೆ ಈ ಮಧ್ಯದ ಟೇಬಲ್ ಅಗತ್ಯವಿದೆ. ಒಂದೇ ಬಳಕೆದಾರನು ಒಂದೇ ಪ್ರಾಜೆಕ್ಟ್ಗೆ ಎರಡು ಬಾರಿ ಸೇರುವುದನ್ನು ತಡೆಯಲು ನಾನು unique constraint ಅನ್ನು ಸೇರಿಸಿದ್ದೇನೆ.
• Board: Tasks ಗಳು boards ಒಳಗೆ ಇರುತ್ತವೆ. Boards ಗಳು projects ಒಳಗೆ ಇರುತ್ತವೆ. ಈ hierarchy ವ್ಯವಸ್ಥೆಯು drag-and-drop ಅನ್ನು ಸುಲಭಗೊಳಿಸುತ್ತದೆ. ಒಂದು ಕಾಲಂನಿಂದ ಇನ್ನೊಂದು ಕಾಲಂಗೆ task ಅನ್ನು ವರ್ಗಾಯಿಸುವುದು ಕೇವಲ ಒಂದು field update ಆಗಿದೆ.
• Task: ಇದು ಮುಖ್ಯವಾದ (core) ಮಾಡೆಲ್ ಆಗಿದೆ. ಇದು User ಮಾಡೆಲ್ಗೆ ಎರಡು ವಿಭಿನ್ನ ಸಂಬಂಧಗಳನ್ನು (relations) ಹೊಂದಿದೆ:
- ನಿಯೋಜಿತ ಬಳಕೆದಾರ (assigned user) (ಇದು ಐಚ್ಛಿಕ).
- ರಚನೆಕಾರ (creator) (ಇದು ಕಡ್ಡಾಯ). Prisma ಗೆ ಯಾವುದು ಯಾವುದು ಎಂದು ತಿಳಿಯಲು ನಾನು ಈ ಸಂಬಂಧಗಳಿಗೆ ಸ್ಪಷ್ಟವಾಗಿ ಹೆಸರನ್ನು ನೀಡಬೇಕಾಯಿತು.
• Comment: ಬಳಕೆದಾರರು tasks ಮೇಲೆ ಕಾಮೆಂಟ್ಗಳನ್ನು ನೀಡಬಹುದು. ಕೋಡ್ ಓದಲು ಸುಲಭವಾಗಲಿ ಎಂಬ ಕಾರಣಕ್ಕೆ ನಾನು "user" ಬದಲಿಗೆ ಸಂಬಂಧಕ್ಕೆ "author" ಎಂದು ಹೆಸರಿಸಿದ್ದೇನೆ.
• Notification: ಬಳಕೆದಾರರಿಗೆ ಸಂದೇಶಗಳನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲು ಒಂದು ಸರಳ ಮಾಡೆಲ್.
𝗧𝗲𝗰𝗵𝗻𝗶𝗰𝗮𝗹 𝗟𝗲𝘀𝘀𝗼𝗻𝘀 𝗟𝗲𝗮𝗿𝗻𝘁
ಇದನ್ನು ನಿರ್ಮಿಸುವಾಗ ನಾನು ಹಲವಾರು ದೋಷಗಳನ್ನು (errors) ಎದುರಿಸಿದೆ. ಇವುಗಳ ಬಗ್ಗೆ ಎಚ್ಚರವಿರಲಿ:
- Relation Names: ಎರಡು field ಗಳು ಒಂದೇ ಮಾಡೆಲ್ ಅನ್ನು ಸೂಚಿಸಿದರೆ, ನೀವು ಸಂಬಂಧಗಳಿಗೆ (relations) ಹೆಸರನ್ನು ನೀಡಲೇಬೇಕು. ನೀವು ಹಾಗೆ ಮಾಡದಿದ್ದರೆ, Prisma ದೋಷವನ್ನು (error) ತೋರಿಸುತ್ತದೆ.
- Nullable Fields: ಒಂದು ಸಂಬಂಧವು ಐಚ್ಛಿಕವಾಗಿದ್ದರೆ, ನೀವು relation field ಮತ್ತು foreign key field ಎರಡರ ಮೇಲೂ ಪ್ರಶ್ನಾರ್ಥಕ ಚಿಹ್ನೆಯನ್ನು ಹಾಕಬೇಕು.
- Syntax Errors: Prisma ನಲ್ಲಿ string defaults ಗಾಗಿ double quotes ಅಗತ್ಯವಿದೆ. Single quotes ಬಳಸಿದರೆ ಅದು ವಿಫಲವಾಗುತ್ತದೆ.
- Relation Syntax: ಯಾವಾಗಲೂ ಸರಿಯಾದ syntax ಬಳಸಿ:
@relation(fields: [localField], references: [remoteField]).
ಈಗ schema ಅನ್ನು migrate ಮಾಡಲಾಗಿದೆ. ಮುಂದಿನ ಹಂತದಲ್ಲಿ, ನಾನು real-time updates ಗಾಗಿ Express backend ಮತ್ತು Socket.io setup ಅನ್ನು ನಿರ್ಮಿಸುತ್ತೇನೆ.
ಶೂನ್ಯದಿಂದ ಪ್ರಾಜೆಕ್ಟ್ ಮ್ಯಾನೇಜ್ಮೆಂಟ್ ಟೂಲ್ ನಿರ್ಮಿಸುವುದು: ಪ್ರಿಸ್ಮಾ ಸ್ಕೀಮಾ (Prisma Schema) ಮೂಲಕ ಪ್ರಾರಂಭಿಸುವುದು
ಒಂದು ಸಾಫ್ಟ್ವೇರ್ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನಿರ್ಮಿಸುವಾಗ, ಅದರ ಅಡಿಪಾಯವು ಅತ್ಯಂತ ಪ್ರಮುಖವಾದುದು. ಒಂದು ಪ್ರಾಜೆಕ್ಟ್ ಮ್ಯಾನೇಜ್ಮೆಂಟ್ ಟೂಲ್ ನಿರ್ಮಿಸುವಾಗ, ಡೇಟಾ ಹೇಗೆ ಸಂಗ್ರಹಿಸಲ್ಪಡುತ್ತದೆ ಮತ್ತು ವಿವಿಧ ಡೇಟಾ ಅಂಶಗಳ ನಡುವೆ ಹೇಗೆ ಸಂಬಂಧವಿದೆ ಎಂಬುದು ಬಹಳ ಮುಖ್ಯ. ಈ ಲೇಖನದಲ್ಲಿ, ನಾವು ಪ್ರಿಸ್ಮಾ (Prisma) ಬಳಸಿ ನಮ್ಮ ಡೇಟಾ ಮಾಡೆಲ್ ಅನ್ನು ಹೇಗೆ ವಿನ್ಯಾಸಗೊಳಿಸುವುದು ಎಂಬುದನ್ನು ನೋಡೋಣ.
ಡೇಟಾ ಮಾಡೆಲಿಂಗ್ ಏಕೆ ಮುಖ್ಯ?
ಡೇಟಾ ಮಾಡೆಲಿಂಗ್ ಎಂದರೆ ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿರುವ ಡೇಟಾ ಅಂಶಗಳನ್ನು ಮತ್ತು ಅವುಗಳ ನಡುವಿನ ಸಂಬಂಧಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುವುದು. ಒಂದು ಉತ್ತಮ ಸ್ಕೀಮಾ (Schema) ಇಲ್ಲದಿದ್ದರೆ, ಅಪ್ಲಿಕೇಶನ್ ಬೆಳೆದಂತೆ ಡೇಟಾ ನಿರ್ವಹಣೆ ಕಷ್ಟವಾಗುತ್ತದೆ. ಪ್ರಿಸ್ಮಾ ಒಂದು ORM (Object-Relational Mapper) ಆಗಿದ್ದು, ಇದು ನಮ್ಮ ಡೇಟಾಬೇಸ್ ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ ನಡುವೆ ಸುರಕ್ಷಿತ ಮತ್ತು ಸುಲಭವಾದ ಸಂಪರ್ಕವನ್ನು ಕಲ್ಪಿಸುತ್ತದೆ.
ಎಂಟಿಟಿಗಳನ್ನು (Entities) ವ್ಯಾಖ್ಯಾನಿಸುವುದು
ನಮ್ಮ ಪ್ರಾಜೆಕ್ಟ್ ಮ್ಯಾನೇಜ್ಮೆಂಟ್ ಟೂಲ್ಗಾಗಿ ನಾವು ಈ ಕೆಳಗಿನ ಪ್ರಮುಖ ಎಂಟಿಟಿಗಳನ್ನು ಗುರುತಿಸೋಣ:
- User (ಬಳಕೆದಾರರು): ಅಪ್ಲಿಕೇಶನ್ ಬಳಸುವ ವ್ಯಕ್ತಿಗಳು.
- Project (ಪ್ರಾಜೆಕ್ಟ್): ಬಳಕೆದಾರರು ನಿರ್ವಹಿಸುವ ಯೋಜನೆಗಳು.
- Task (ಕಾರ್ಯ): ಒಂದು ಪ್ರಾಜೆಕ್ಟ್ನ ಅಡಿಯಲ್ಲಿ ಬರುವ ನಿರ್ದಿಷ್ಟ ಕೆಲಸಗಳು.
- Comment (মন্ত评论): ಕಾರ್ಯಗಳ ಬಗ್ಗೆ ಚರ್ಚಿಸಲು ಬಳಸುವ ಕಾಮೆಂಟ್ಗಳು.
ಪ್ರಿಸ್ಮಾ ಸ್ಕೀಮಾ (Prisma Schema)
ಈಗ, ನಾವು ಈ ಎಂಟಿಟಿಗಳನ್ನು ಪ್ರಿಸ್ಮಾ ಸ್ಕೀಮಾದಲ್ಲಿ ಹೇಗೆ ಬರೆಯಬಹುದು ಎಂಬುದನ್ನು ನೋಡೋಣ.
// This is your Prisma schema file
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model User {
id String @id @default(cuid())
email String @unique
name String?
projects Project[]
tasks Task[]
comments Comment[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Project {
id String @id @default(cuid())
title String
description String?
ownerId String
owner User @relation(fields: [ownerId], references: [id])
tasks Task[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Task {
id String @id @default(cuid())
title String
description String?
status Status @default(TODO)
projectId String
project Project @relation(fields: [projectId], references: [id])
assigneeId String?
assignee User? @relation(fields: [assigneeId], references: [id])
comments Comment[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Comment {
id String @id @default(cuid())
content String
taskId String
task Task @relation(fields: [taskId], references: [id])
authorId String
author User @relation(fields: [authorId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
enum Status {
TODO
IN_PROGRESS
DONE
}
ಸಂಬಂಧಗಳ ವಿಶ್ಲೇಷಣೆ (Analyzing Relationships)
ಮೇಲಿನ ಸ್ಕೀಮಾದಲ್ಲಿ ನಾವು ಕೆಲವು ಪ್ರಮುಖ ಸಂಬಂಧಗಳನ್ನು ಬಳಸಿದ್ದೇವೆ:
- One-to-Many (ಒಂದಕ್ಕೆ ಅನೇಕ): ಒಬ್ಬ ಬಳಕೆದಾರ ಅನೇಕ ಪ್ರಾಜೆಕ್ಟ್ಗಳನ್ನು ಹೊಂದಿರಬಹುದು (
User->Project). ಹಾಗೆಯೇ, ಒಂದು ಪ್ರಾಜೆಕ್ಟ್ನಲ್ಲಿ ಅನೇಕ ಕಾರ್ಯಗಳಿರಬಹುದು (Project->Task). - Optional Relations (ಐಚ್ಛಿಕ ಸಂಬಂಧಗಳು): ಒಂದು ಕಾರ್ಯಕ್ಕೆ (Task) ಒಬ್ಬ ಬಳಕೆದಾರರನ್ನು ನಿಯೋಜಿಸಬಹುದು (Assignee), ಆದರೆ ಅದು ಕಡ್ಡಾಯವಲ್ಲ (
assigneeId String?). - Enums: ನಾವು ಕಾರ್ಯದ ಸ್ಥಿತಿಯನ್ನು (Status) ನಿರ್ದಿಷ್ಟ ಮಾಡಲು
enumಅನ್ನು ಬಳಸಿದ್ದೇವೆ, ಇದು ಡೇಟಾ ಸ್ಥಿರತೆಯನ್ನು ಕಾಪಾಡುತ್ತದೆ.
ಮುಕ್ತಾಯ
ಒಳ್ಳೆಯ ಸ್ಕೀಮಾ ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ನ ದಕ್ಷತೆಯನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ ಮತ್ತು ಅಭಿವೃದ್ಧಿ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಸುಲಭಗೊಳಿಸುತ್ತದೆ. ಮುಂದಿನ ಲೇಖನಗಳಲ್ಲಿ, ನಾವು ಈ ಸ್ಕೀಮಾವನ್ನು ಬಳಸಿ API ಅನ್ನು ಹೇಗೆ ನಿರ್ಮಿಸುವುದು ಎಂಬುದನ್ನು ನೋಡೋಣ.