Relationship Patterns
The database uses three main relationship patterns:- One-to-One - Single record references another (e.g., User → Profile)
- One-to-Many - One record has multiple children (e.g., User → Sessions)
- Many-to-Many - Records relate through join tables (e.g., Posts ↔ Authors)
Authentication Relationships
User Relations
Theuser table is central to authentication and serves as the root for most relationships:
- Diagram
- Details
Session Relations
session.userId→user.id(CASCADE DELETE)
Account Relations
account.userId→user.id(CASCADE DELETE)
Organization Relations
Member Relations
member.organizationId→organization.id(CASCADE DELETE)member.userId→user.id(CASCADE DELETE)
Invitation Relations
invitation.organizationId→organization.id(CASCADE DELETE)invitation.inviterId→user.id(CASCADE DELETE)
Profile Relationships
User → Profile (One-to-One)
While not explicitly defined with relations in the schema, the profile table has a unique constraint onuserId:
userId unique constraint enforces this.
Blog Relationships
Blog Post Relations
Many-to-Many: Posts ↔ Authors
Join Table:blog_post_authors
Many-to-Many: Posts ↔ Categories
Join Table:blog_post_categories
Many-to-Many: Posts ↔ Media
Join Table:blog_post_media
Blog Author Relations
blogAuthors.avatarId→blogMedia.idblogAuthors.worksForId→blogOrganizations.id
Blog Category Relations
Blog Comments Relations
Blog Translations Relations
blogTranslations.postId→blogPosts.id
Services Relationships
Service Listing Relations
Many-to-Many: Services ↔ Media
Join Table:services_media_links
Service Category Relations
Service Reviews Relations
servicesReviews.serviceId→servicesListings.idservicesReviews.parentId→servicesReviews.id(self-reference)
Service Availability Relations
servicesAvailability.serviceId→servicesListings.id
Service Bookings Relations
servicesBookings.serviceId→servicesListings.id
servicesBookings.customerId→user.idservicesBookings.providerId→user.id
Service Translations Relations
servicesTranslations.serviceId→servicesListings.id
Complete Relationship Diagram
Authentication & Users
Blog System
Services Marketplace
Cascade Deletion Rules
User Deletion Cascades
When a user is deleted, these are automatically removed:- All sessions
- All linked accounts (OAuth)
- All organization memberships
- All invitations sent by user
Organization Deletion Cascades
When an organization is deleted:- All members are removed
- All pending invitations are removed
Post/Service Deletion
Note that blog posts and services don’t have explicit cascade rules defined at the database level, but should be handled at the application level:- Deleting a post should remove translations, comments, and join table entries
- Deleting a service should remove reviews, bookings, and availability
Querying Relations with Drizzle
Basic Relation Query
Nested Relations
Many-to-Many Query
Self-Referencing Query
Best Practices
1. Always Use Relations for Type Safety
Drizzle relations provide full TypeScript inference:2. Use Cascade Deletes Carefully
Cascade deletes are powerful but dangerous:- Use CASCADE for dependent data (sessions, tokens)
- Consider soft deletes for user-generated content
- Always test deletion in development first
3. Optimize Nested Queries
Avoid over-fetching with selective includes:4. Use Indexes for Foreign Keys
All foreign key columns should be indexed:5. Handle Soft Deletes for Content
For user-generated content, consider soft deletes:Next Steps
Schema Reference
View detailed schema documentation
Migrations
Learn how to create and apply migrations