Prisma वापरून प्रोजेक्ट मॅनेजमेंट टूल तयार करणे
मी Trello सारखे एक कोलाबोरेटिव्ह प्रोजेक्ट मॅनेजमेंट टूल तयार करत आहे. मी यासाठी React, Express.js, PostgreSQL आणि Socket.io वापरत आहे.
पहिले पाऊल म्हणजे डेटाबेस स्कीमा (database schema). मी युजर्स, प्रोजेक्ट्स, बोर्ड्स, टास्क, कमेंट्स आणि नोटिफिकेशन्स हाताळण्यासाठी सहा मॉडेल्स डिझाइन केली आहेत.
माझ्या Prisma स्कीमा डिझाइनमधील काही महत्त्वाचे तांत्रिक निर्णय आणि धडे खालीलप्रमाणे आहेत:
• IDs साठी CUID वापरा
मी सर्व IDs साठी @default(cuid()) वापरतो. पब्लिक URLs साठी साध्या नंबर्सपेक्षा हे अधिक चांगले आहेत. यामुळे तुमच्याकडे किती रेकॉर्ड्स आहेत याचा अंदाज लावणे कठीण होते.
• स्पष्ट रिलेशन नावे (Explicit Relation Names)
जेव्हा दोन फील्ड्स एकाच मॉडेलकडे निर्देश करतात, तेव्हा Prisma गोंधळू शकते. उदाहरणार्थ, एका टास्कमध्ये एक क्रिएटर (creator) आणि एक असाइनि (assignee) असतो. हे दोन्ही 'Users' आहेत. मायग्रेशन एरर्स टाळण्यासाठी मला @relation नावे वापरून हे रिलेशन्स स्पष्टपणे द्यावे लागतात.
• Many-to-Many रिलेशन्ससाठी जंक्शन टेबल्स (Junction Tables)
एक युजर अनेक प्रोजेक्ट्सचा भाग असू शकतो. एका प्रोजेक्टमध्ये अनेक युजर्स असू शकतात. त्यांना जोडण्यासाठी मी ProjectMember मॉडेल तयार केले आहे. मी userId आणि projectId वर एक 'unique constraint' जोडली आहे. यामुळे एकच युजर दोनदा एकाच प्रोजेक्टमध्ये सामील होऊ शकत नाही.
• हायरार्की आणि लॉजिक (Hierarchy and Logic)
टास्क हे थेट प्रोजेक्ट्समध्ये नसतात, तर ते बोर्ड्समध्ये असतात. बोर्ड्स प्रोजेक्ट्समध्ये असतात. यामुळे 'drag-and-drop' सोपे होते. टास्क हलवण्यासाठी तुम्हाला फक्त त्याचा boardId अपडेट करावा लागतो.
• नलबेबल रिलेशन्स (Nullable Relations)
काही रिलेशन्स आवश्यक असतात आणि काही ऐच्छिक (optional) असतात. टास्कसाठी क्रिएटर असणे अनिवार्य आहे, म्हणून मी प्रश्नचिन्ह (?) वापरत नाही. असाइनि (assignee) ऐच्छिक आहे, म्हणून मी User? आणि String? वापरतो. स्कीमा व्यवस्थित काम करण्यासाठी तुम्हाला दोन्ही गोष्टींचा समावेश करणे आवश्यक आहे.
मला आढळलेल्या काही सामान्य चुका:
- डिफॉल्ट्ससाठी सिंगल कोट्स वापरणे. Prisma मध्ये डबल कोट्स आवश्यक असतात.
- रेफरन्स सिंटॅक्समध्ये कोलन (:) विसरणे.
- चुकून ID फील्डला
@default(now())लागू करणे.
पुढच्या टप्प्यात, मी Express बॅकएंड तयार करेन आणि रिअल-टाइम अपडेट्ससाठी Socket.io सेट करेन.