𝗕𝘂𝗶𝗹𝗱𝗶𝗻𝗴 𝗮 𝗣𝗿𝗼𝗷𝗲𝗰𝘁 𝗠𝗮𝗻𝗮𝗴𝗲𝗺𝗲𝗻𝘁 𝗧𝗼𝗼𝗹 𝘄𝗶𝘁𝗵 𝗣𝗿𝗶𝘀𝗺𝗮
నేను Trello లాంటి ఒక కొలాబరేటివ్ ప్రాజెక్ట్ మేనేజ్మెంట్ టూల్ను నిర్మిస్తున్నాను. నేను React, Express.js, PostgreSQL మరియు Socket.io ఉపయోగిస్తున్నాను.
మొదటి దశ డేటాబేస్ స్కీమా (database schema). యూజర్లు, ప్రాజెక్ట్లు, బోర్డులు, టాస్క్లు, కామెంట్లు మరియు నోటిఫికేషన్లను నిర్వహించడానికి నేను ఆరు మోడల్లను రూపొందించాను.
నా Prisma స్కీమా డిజైన్ నుండి కొన్ని ముఖ్యమైన సాంకేతిక ఎంపికలు మరియు పాఠాలు ఇక్కడ ఉన్నాయి:
• IDల కోసం CUIDని ఉపయోగించడం
నేను అన్ని IDల కోసం @default(cuid()) ఉపయోగిస్తున్నాను. పబ్లిక్ URLల కోసం ఇవి సాధారణ నంబర్ల కంటే మెరుగ్గా ఉంటాయి. మీ వద్ద ఎన్ని రికార్డులు ఉన్నాయో ప్రజలు ఊహించకుండా ఇవి నిరోధిస్తాయి.
• స్పష్టమైన రిలేషన్ పేర్లు (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)
కొన్ని రిలేషన్లు తప్పనిసరి (required), మరికొన్ని ఐచ్ఛికం (optional). ఒక టాస్క్కు క్రియేటర్ తప్పనిసరిగా ఉండాలి, కాబట్టి నేను ప్రశ్న గుర్తును (?) ఉపయోగించను. అసైనీ అనేది ఐచ్ఛికం, కాబట్టి నేను User? మరియు String? ఉపయోగిస్తాను. స్కీమా సరిగ్గా పనిచేయడానికి మీరు రెండింటినీ చేర్చాలి.
నేను గుర్తించిన సాధారణ తప్పులు:
- డిఫాల్ట్ల కోసం సింగిల్ కోట్స్ ఉపయోగించడం. Prisma కి డబుల్ కోట్స్ అవసరం.
- రిఫరెన్స్ సింటాక్స్లో కోలన్ (:) మర్చిపోవడం.
- పొరపాటున ID ఫీల్డ్కు
@default(now())ను వర్తింపజేయడం.
తదుపరి దశలో, నేను Express బ్యాకెండ్ను నిర్మిస్తాను మరియు రియల్-టైమ్ అప్డేట్ల కోసం Socket.ioని సెటప్ చేస్తాను.