Database Schema
Overview of the database schema and relationships.
Core Tables
User
Base user account table.
Fields:
id(UUID) - Primary keyphone(String) - Unique phone numberrole(Enum) - PROVIDER, SERVICE_SEEKER, ADMINstatus(Enum) - ACTIVE, SUSPENDED, BANNEDonesignalSubscriptionId- Push notification IDlastConnectedAt- Last active timestamp
Relationships:
- Has one ServiceSeeker or Provider profile
- Has many Jobs
- Has many Reviews
- Has many Conversations
- Has many Locations
ServiceSeeker
Service seeker profile.
Fields:
id,userId,firstName,lastName,email,profilePhoto
Relationships:
- Belongs to User
Provider
Provider profile.
Fields:
id,userId,firstName,lastName,email,profilePhotoisVerified- Verification statusisOnline- Online/offline statusbusinessName- Business nameserviceLocation,serviceType
Relationships:
- Belongs to User
- Has many Jobs
- Has many Reviews
- Has many Qualifications
- Has many ProviderServices
Job
Job/booking record.
Fields:
id,userId,providerId,serviceId,categoryIddescription,location,dateTimestatus- Job status enumestimatedCost,actualCostisCallOut- BooleancompletedAt
Relationships:
- Belongs to User (service seeker)
- Belongs to Provider (optional)
- Has many Reviews
Conversation & Message
Chat messaging system.
Conversation:
id,jobId(optional),createdAt,updatedAt
Message:
id,conversationId,senderId,content,sentAt,readAt
Otp
OTP verification codes.
Fields:
id,phone,code,expiresAt,verified,createdAt
SmsRateLimit
SMS rate limiting tracking.
Fields:
id,phone,count,lastSentAt,resetDate,createdAt,updatedAt
Constraints:
- Unique constraint on
phone+resetDate
Entity Relationship Diagram
User
├── ServiceSeeker (optional)
├── Provider (optional)
├── Jobs[]
├── Reviews[] (as rater and rated)
├── Conversations[]
├── Locations[]
└── Documents[]
Provider
├── Jobs[]
├── Reviews[]
├── Qualifications[]
└── ProviderServices[]
Job
├── User (service seeker)
├── Provider (optional)
└── Reviews[]
Conversation
├── Participants[]
└── Messages[]
Category
└── Services[]
Indexes
Key indexes for performance:
phoneon User (unique)userId,providerId,serviceIdon Jobphone,code,verifiedon Otpphone,resetDateon SmsRateLimit
Migration Strategy
- Prisma migrations track schema changes
- All migrations stored in
prisma/migrations/ - Run migrations before deploying new code
- Test migrations on staging first