𝗕𝘂𝗶𝗹𝗱𝗶𝗻𝗴 𝗮 𝗣𝗿𝗼𝗷𝗲𝗰𝘁 𝗠𝗮𝗻𝗮𝗴𝗲𝗺𝗲𝗻𝘁 𝗧𝗼𝗼𝗹 𝘄𝗶𝘁𝗵 𝗣𝗿𝗶𝘀𝗺𝗮

ನಾನು 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) ಹೊಂದಿದೆ:

• Comment: ಬಳಕೆದಾರರು tasks ಮೇಲೆ ಕಾಮೆಂಟ್‌ಗಳನ್ನು ನೀಡಬಹುದು. ಕೋಡ್ ಓದಲು ಸುಲಭವಾಗಲಿ ಎಂಬ ಕಾರಣಕ್ಕೆ ನಾನು "user" ಬದಲಿಗೆ ಸಂಬಂಧಕ್ಕೆ "author" ಎಂದು ಹೆಸರಿಸಿದ್ದೇನೆ.

• Notification: ಬಳಕೆದಾರರಿಗೆ ಸಂದೇಶಗಳನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲು ಒಂದು ಸರಳ ಮಾಡೆಲ್.

𝗧𝗲𝗰𝗵𝗻𝗶𝗰𝗮𝗹 𝗟𝗲𝘀𝘀𝗼𝗻𝘀 𝗟𝗲𝗮𝗿𝗻𝘁

ಇದನ್ನು ನಿರ್ಮಿಸುವಾಗ ನಾನು ಹಲವಾರು ದೋಷಗಳನ್ನು (errors) ಎದುರಿಸಿದೆ. ಇವುಗಳ ಬಗ್ಗೆ ಎಚ್ಚರವಿರಲಿ:

ಈಗ schema ಅನ್ನು migrate ಮಾಡಲಾಗಿದೆ. ಮುಂದಿನ ಹಂತದಲ್ಲಿ, ನಾನು real-time updates ಗಾಗಿ Express backend ಮತ್ತು Socket.io setup ಅನ್ನು ನಿರ್ಮಿಸುತ್ತೇನೆ.

ಶೂನ್ಯದಿಂದ ಪ್ರಾಜೆಕ್ಟ್ ಮ್ಯಾನೇಜ್‌ಮೆಂಟ್ ಟೂಲ್ ನಿರ್ಮಿಸುವುದು: ಪ್ರಿಸ್ಮಾ ಸ್ಕೀಮಾ (Prisma Schema) ಮೂಲಕ ಪ್ರಾರಂಭಿಸುವುದು

ಒಂದು ಸಾಫ್ಟ್‌ವೇರ್ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನಿರ್ಮಿಸುವಾಗ, ಅದರ ಅಡಿಪಾಯವು ಅತ್ಯಂತ ಪ್ರಮುಖವಾದುದು. ಒಂದು ಪ್ರಾಜೆಕ್ಟ್ ಮ್ಯಾನೇಜ್‌ಮೆಂಟ್ ಟೂಲ್ ನಿರ್ಮಿಸುವಾಗ, ಡೇಟಾ ಹೇಗೆ ಸಂಗ್ರಹಿಸಲ್ಪಡುತ್ತದೆ ಮತ್ತು ವಿವಿಧ ಡೇಟಾ ಅಂಶಗಳ ನಡುವೆ ಹೇಗೆ ಸಂಬಂಧವಿದೆ ಎಂಬುದು ಬಹಳ ಮುಖ್ಯ. ಈ ಲೇಖನದಲ್ಲಿ, ನಾವು ಪ್ರಿಸ್ಮಾ (Prisma) ಬಳಸಿ ನಮ್ಮ ಡೇಟಾ ಮಾಡೆಲ್ ಅನ್ನು ಹೇಗೆ ವಿನ್ಯಾಸಗೊಳಿಸುವುದು ಎಂಬುದನ್ನು ನೋಡೋಣ.

ಡೇಟಾ ಮಾಡೆಲಿಂಗ್ ಏಕೆ ಮುಖ್ಯ?

ಡೇಟಾ ಮಾಡೆಲಿಂಗ್ ಎಂದರೆ ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿರುವ ಡೇಟಾ ಅಂಶಗಳನ್ನು ಮತ್ತು ಅವುಗಳ ನಡುವಿನ ಸಂಬಂಧಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುವುದು. ಒಂದು ಉತ್ತಮ ಸ್ಕೀಮಾ (Schema) ಇಲ್ಲದಿದ್ದರೆ, ಅಪ್ಲಿಕೇಶನ್ ಬೆಳೆದಂತೆ ಡೇಟಾ ನಿರ್ವಹಣೆ ಕಷ್ಟವಾಗುತ್ತದೆ. ಪ್ರಿಸ್ಮಾ ಒಂದು ORM (Object-Relational Mapper) ಆಗಿದ್ದು, ಇದು ನಮ್ಮ ಡೇಟಾಬೇಸ್ ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ ನಡುವೆ ಸುರಕ್ಷಿತ ಮತ್ತು ಸುಲಭವಾದ ಸಂಪರ್ಕವನ್ನು ಕಲ್ಪಿಸುತ್ತದೆ.

ಎಂಟಿಟಿಗಳನ್ನು (Entities) ವ್ಯಾಖ್ಯಾನಿಸುವುದು

ನಮ್ಮ ಪ್ರಾಜೆಕ್ಟ್ ಮ್ಯಾನೇಜ್‌ಮೆಂಟ್ ಟೂಲ್‌ಗಾಗಿ ನಾವು ಈ ಕೆಳಗಿನ ಪ್ರಮುಖ ಎಂಟಿಟಿಗಳನ್ನು ಗುರುತಿಸೋಣ:

ಪ್ರಿಸ್ಮಾ ಸ್ಕೀಮಾ (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)

ಮೇಲಿನ ಸ್ಕೀಮಾದಲ್ಲಿ ನಾವು ಕೆಲವು ಪ್ರಮುಖ ಸಂಬಂಧಗಳನ್ನು ಬಳಸಿದ್ದೇವೆ:

  1. One-to-Many (ಒಂದಕ್ಕೆ ಅನೇಕ): ಒಬ್ಬ ಬಳಕೆದಾರ ಅನೇಕ ಪ್ರಾಜೆಕ್ಟ್‌ಗಳನ್ನು ಹೊಂದಿರಬಹುದು (User -> Project). ಹಾಗೆಯೇ, ಒಂದು ಪ್ರಾಜೆಕ್ಟ್‌ನಲ್ಲಿ ಅನೇಕ ಕಾರ್ಯಗಳಿರಬಹುದು (Project -> Task).
  2. Optional Relations (ಐಚ್ಛಿಕ ಸಂಬಂಧಗಳು): ಒಂದು ಕಾರ್ಯಕ್ಕೆ (Task) ಒಬ್ಬ ಬಳಕೆದಾರರನ್ನು ನಿಯೋಜಿಸಬಹುದು (Assignee), ಆದರೆ ಅದು ಕಡ್ಡಾಯವಲ್ಲ (assigneeId String?).
  3. Enums: ನಾವು ಕಾರ್ಯದ ಸ್ಥಿತಿಯನ್ನು (Status) ನಿರ್ದಿಷ್ಟ ಮಾಡಲು enum ಅನ್ನು ಬಳಸಿದ್ದೇವೆ, ಇದು ಡೇಟಾ ಸ್ಥಿರತೆಯನ್ನು ಕಾಪಾಡುತ್ತದೆ.

ಮುಕ್ತಾಯ

ಒಳ್ಳೆಯ ಸ್ಕೀಮಾ ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್‌ನ ದಕ್ಷತೆಯನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ ಮತ್ತು ಅಭಿವೃದ್ಧಿ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಸುಲಭಗೊಳಿಸುತ್ತದೆ. ಮುಂದಿನ ಲೇಖನಗಳಲ್ಲಿ, ನಾವು ಈ ಸ್ಕೀಮಾವನ್ನು ಬಳಸಿ API ಅನ್ನು ಹೇಗೆ ನಿರ್ಮಿಸುವುದು ಎಂಬುದನ್ನು ನೋಡೋಣ.