Xây dựng công cụ quản lý dự án với Prisma
Tôi đang xây dựng một công cụ quản lý dự án cộng tác giống như Trello. Tôi đang sử dụng React, Express.js, PostgreSQL và Socket.io.
Bước đầu tiên là sơ đồ cơ sở dữ liệu (database schema). Tôi đã thiết kế sáu model để xử lý người dùng (users), dự án (projects), bảng (boards), nhiệm vụ (tasks), bình luận (comments) và thông báo (notifications).
Dưới đây là các lựa chọn kỹ thuật chính và những bài học rút ra từ việc thiết kế schema Prisma của tôi:
• Sử dụng CUID cho các ID
Tôi sử dụng @default(cuid()) cho tất cả các ID. Những ID này tốt hơn các con số đơn giản khi dùng cho các URL công khai. Chúng ngăn chặn việc mọi người đoán được bạn đang có bao nhiêu bản ghi.
• Tên quan hệ tường minh (Explicit Relation Names)
Khi hai trường cùng trỏ đến một model, Prisma sẽ bị nhầm lẫn. Ví dụ, một nhiệm vụ (task) có một người tạo (creator) và một người được giao (assignee). Cả hai đều là Users. Tôi phải đặt tên cho các quan hệ này một cách tường minh bằng cách sử dụng tên @relation để tránh lỗi migration.
• Bảng trung gian (Junction Tables) cho các quan hệ Nhiều-Nhiều (Many-to-Many)
Một người dùng có thể thuộc về nhiều dự án. Một dự án có thể có nhiều người dùng. Tôi đã tạo một model ProjectMember để liên kết chúng. Tôi đã thêm một ràng buộc duy nhất (unique constraint) cho userId và projectId. Điều này ngăn việc cùng một người dùng tham gia vào một dự án hai lần.
• Phân cấp và Logic
Các nhiệm vụ (tasks) không nằm trực tiếp trong dự án. Chúng nằm trong các bảng (boards). Các bảng lại nằm trong dự án. Điều này giúp việc kéo-thả (drag-and-drop) trở nên đơn giản. Để di chuyển một nhiệm vụ, bạn chỉ cần cập nhật boardId của nó.
• Quan hệ có thể để trống (Nullable Relations)
Một số quan hệ là bắt buộc, và một số là tùy chọn. Một nhiệm vụ phải có người tạo, vì vậy tôi không sử dụng dấu chấm hỏi. Người được giao là tùy chọn, vì vậy tôi sử dụng User? và String?. Bạn phải bao gồm cả hai để schema hoạt động được.
Những lỗi phổ biến tôi đã gặp:
- Sử dụng dấu nháy đơn cho các giá trị mặc định. Prisma yêu cầu dấu nháy kép.
- Quên dấu hai chấm trong cú pháp tham chiếu (references syntax).
- Áp dụng
@default(now())cho trường ID do nhầm lẫn.
Tiếp theo, tôi sẽ xây dựng backend bằng Express và thiết lập Socket.io để cập nhật theo thời gian thực.