Membina Alat Pengurusan Projek dengan Prisma
Saya sedang membina alat pengurusan projek kolaboratif seperti Trello.
Saya menggunakan React, Express.js, PostgreSQL, dan Socket.io. Sebelum saya menulis sebarang laluan (routes) backend, saya mesti mereka bentuk skema pangkalan data.
Skema adalah asasnya. Jika skema salah, keseluruhan aplikasi akan gagal. Berikut adalah pecahan reka bentuk skema Prisma saya.
Model-model
• User: Menyimpan nama, e-mel, dan kata laluan. Saya menggunakan cuid() untuk ID. Ini menghasilkan rentetan (string) yang panjang dan unik. Ia lebih baik daripada nombor kerana ia tidak mendedahkan jumlah pengguna anda dalam URL.
• Project: Memegang nama dan deskripsi projek. Saya menjadikan deskripsi sebagai pilihan (optional) dengan menggunakan tanda soal.
• ProjectMember: Ini adalah jadual perantaraan (junction table). Ia menghubungkan User kepada Project. Memandangkan seorang pengguna boleh menyertai banyak projek, dan satu projek mempunyai ramai pengguna, anda memerlukan jadual tengah ini untuk mengurus hubungan many-to-many. Saya menambah kekangan unik (unique constraint) untuk menghalang pengguna yang sama daripada menyertai projek yang sama sebanyak dua kali.
• Board: Tugasan (Tasks) berada di dalam board. Board pula berada di dalam projek. Hierarki ini memudahkan fungsi seret-dan-lepas (drag-and-drop). Menggerakkan tugasan antara lajur hanyalah satu kemas kini medan tunggal.
• Task: Ini adalah model teras. Ia mempunyai dua hubungan (relation) yang berbeza kepada model User:
- Pengguna yang ditugaskan (ini adalah pilihan).
- Pencipta (ini adalah wajib). Saya perlu menamakan hubungan ini secara eksplisit supaya Prisma dapat membezakannya.
• Comment: Pengguna boleh meninggalkan komen pada tugasan. Saya menamakan hubungan tersebut sebagai "author" dan bukannya "user" untuk memastikan kod mudah dibaca.
• Notification: Model ringkas untuk menjejak mesej bagi pengguna.
Pengajaran Teknikal yang Diperoleh
Saya menghadapi beberapa ralat semasa membina ini. Berhati-hati dengan perkara berikut:
- Nama Hubungan (Relation Names): Jika dua medan merujuk kepada model yang sama, anda mesti menamakan hubungan tersebut. Jika tidak, Prisma akan mengeluarkan ralat.
- Medan Boleh-Null (Nullable Fields): Jika sesuatu hubungan adalah pilihan, anda mesti meletakkan tanda soal pada medan hubungan dan juga medan kunci asing (foreign key).
- Ralat Sintaks: Prisma memerlukan tanda petikan berganda untuk nilai lalai (default) rentetan. Tanda petikan tunggal akan menyebabkan kegagalan.
- Sintaks Hubungan: Sentiasa gunakan sintaks yang betul:
@relation(fields: [localField], references: [remoteField]).
Skema kini telah dimigrasikan. Seterusnya, saya akan membina backend Express dan persediaan Socket.io untuk kemas kini masa nyata (real-time).