Prisma ഉപയോഗിച്ച് ഒരു പ്രോജക്റ്റ് മാനേജ്മെന്റ് ടൂൾ നിർമ്മിക്കുന്നു
ഞാൻ Trello പോലെ ഒരു കൊളാബറേറ്റീവ് പ്രോജക്റ്റ് മാനേജ്മെന്റ് ടൂൾ നിർമ്മിക്കുകയാണ്.
ഇതിനായി ഞാൻ React, Express.js, PostgreSQL, Socket.io എന്നിവ ഉപയോഗിക്കുന്നു. ബാക്കെൻഡ് റൂട്ടുകൾ (backend routes) എഴുതുന്നതിന് മുമ്പ്, എനിക്ക് ഡാറ്റാബേസ് സ്കീം (database schema) രൂപകൽപ്പന ചെയ്യേണ്ടതുണ്ട്.
സ്കീം ആണ് ഇതിന്റെ അടിസ്ഥാനം. സ്കീമിൽ തെറ്റുണ്ടെങ്കിൽ ആപ്പ് പൂർണ്ണമായും പരാജയപ്പെടും. Prisma സ്കീം ഡിസൈനിന്റെ എന്റെ വിശകലനം താഴെ നൽകുന്നു.
മോഡലുകൾ
• User: പേരുകൾ, ഇമെയിലുകൾ, പാസ്വേഡുകൾ എന്നിവ സൂക്ഷിക്കുന്നു. ഐഡികൾക്കായി (IDs) ഞാൻ cuid() ഉപയോഗിക്കുന്നു. ഇത് നീളമുള്ളതും സവിശേഷവുമായ (unique) സ്ട്രിംഗുകൾ സൃഷ്ടിക്കുന്നു. URL-ലൂടെ ഉപയോക്താക്കളുടെ എണ്ണം പുറത്തറിയാത്തതിനാൽ ഇത് നമ്പറുകളേക്കാൾ മികച്ചതാണ്.
• Project: പ്രോജക്റ്റ് പേരും വിവരണവും (description) ഇതിൽ ഉൾപ്പെടുന്നു. ഒരു ചോദ്യചിഹ്നം (?) ഉപയോഗിച്ച് ഞാൻ വിവരണത്തെ ഓപ്ഷണൽ (optional) ആക്കി മാറ്റി.
• ProjectMember: ഇതൊരു ജംഗ്ഷൻ ടേബിൾ (junction table) ആണ്. ഇത് Users-നെ Projects-മായി ബന്ധിപ്പിക്കുന്നു. ഒരു ഉപയോക്താവിന് ഒന്നിലധികം പ്രോജക്റ്റുകളിൽ ചേരാമെന്നതിനാലും, ഒരു പ്രോജക്റ്റിൽ ഒന്നിലധികം ഉപയോക്താക്കൾ ഉണ്ടാകുമെന്നതിനാലും, ഈ many-to-many റിലേഷൻഷിപ്പ് കൈകാര്യം ചെയ്യാൻ ഈ ഇടനില ടേബിൾ ആവശ്യമാണ്. ഒരേ ഉപയോക്താവ് തന്നെ ഒരു പ്രോജക്റ്റിൽ രണ്ടുതവണ ചേരുന്നത് ഒഴിവാക്കാൻ ഞാൻ ഒരു unique constraint ചേർത്തു.
• Board: ടാസ്ക്കുകൾ (Tasks) ബോർഡുകൾക്കുള്ളിലാണ് വരുന്നത്. ബോർഡുകൾ പ്രോജക്റ്റുകൾക്കുള്ളിലാണ്. ഈ ശ്രേണി (hierarchy) ഡ്രാഗ്-ആൻഡ്-ഡ്രോപ്പ് (drag-and-drop) എളുപ്പമാക്കുന്നു. കോളങ്ങൾക്കിടയിൽ ഒരു ടാസ്ക് മാറ്റുന്നത് ഒരു ഫീൽഡ് അപ്ഡേറ്റ് മാത്രമാണ്.
• Task: ഇതാണ് പ്രധാന മോഡൽ. ഇതിന് User മോഡലുമായി രണ്ട് വ്യത്യസ്ത റിലേഷനുകൾ ഉണ്ട്:
- അസൈൻ ചെയ്ത ഉപയോക്താവ് (ഇത് ഓപ്ഷണൽ ആണ്).
- ക്രിയേറ്റർ (ഇത് നിർബന്ധമാണ്). Prisma-യ്ക്ക് ഇവ തിരിച്ചറിയാൻ വേണ്ടി എനിക്ക് ഈ റിലേഷനുകൾക്ക് പ്രത്യേകം പേരുകൾ നൽകേണ്ടി വന്നു.
• Comment: ഉപയോക്താക്കൾക്ക് ടാസ്ക്കുകളിൽ കമന്റുകൾ ഇടാം. കോഡ് വായിക്കാൻ എളുപ്പമാക്കുന്നതിനായി ഞാൻ റിലേഷന് "user" എന്നതിന് പകരം "author" എന്ന് പേരിട്ടു.
• Notification: ഉപയോക്താക്കൾക്കുള്ള സന്ദേശങ്ങൾ ട്രാക്ക് ചെയ്യാനുള്ള ലളിതമായ ഒരു മോഡൽ.
സാങ്കേതിക പാഠങ്ങൾ
ഇത് നിർമ്മിക്കുന്നതിനിടയിൽ ഞാൻ പല പിശകുകളും (errors) നേരിട്ടിട്ടുണ്ട്. ഇവ ശ്രദ്ധിക്കുക:
- Relation Names: രണ്ട് ഫീൽഡുകൾ ഒരേ മോഡലിലേക്ക് വിരൽ ചൂണ്ടുന്നുണ്ടെങ്കിൽ, നിങ്ങൾ റിലേഷനുകൾക്ക് പേര് നൽകണം. അങ്ങനെ ചെയ്തില്ലെങ്കിൽ Prisma ഒരു എറർ കാണിക്കും.
- Nullable Fields: ഒരു റിലേഷൻ ഓപ്ഷണൽ ആണെങ്കിൽ, റിലേഷൻ ഫീൽഡിലും ഫോറിൻ കീ (foreign key) ഫീൽഡിലും നിങ്ങൾ ഒരു ചോദ്യചിഹ്നം (?) നൽകണം.
- Syntax Errors: സ്ട്രിംഗ് ഡിഫോൾട്ടുകൾക്കായി (string defaults) Prisma ഡബിൾ കോട്ട്സ് (" ") ആവശ്യപ്പെടുന്നു. സിംഗിൾ കോട്ട്സ് (') ഉപയോഗിച്ചാൽ അത് പരാജയപ്പെടും.
- Relation Syntax: എപ്പോഴും ശരിയായ സിന്റാക്സ് ഉപയോഗിക്കുക:
@relation(fields: [localField], references: [remoteField]).
സ്കീം ഇപ്പോൾ മൈഗ്രേറ്റ് (migrated) ചെയ്തിട്ടുണ്ട്. അടുത്തതായി, റിയൽ-ടൈം അപ്ഡേറ്റുകൾക്കായി ഞാൻ Express ബാക്കെൻഡും Socket.io സെറ്റപ്പും നിർമ്മിക്കും.