Entity Relationships
This document describes the relationships between all entities in the IBW Backend Service database, with visual flowcharts showing how entities connect.
Core Entity Relationships
User-Centric Relationships
The users table is the central entity, connecting to most other tables in the system.
Event System Relationships
Events connect to conferences, speakers, and attendees.
Quest System Relationships
The quest system has a hierarchical structure with quests, tasks, and user progress.
Conference System Relationships
Conferences connect to events, speakers, attendees, and agenda items.
Notification System Relationships
Notifications connect users to various notification types and jobs.
Enrichment System Relationships
Enrichment tables provide AI-powered insights about users.
Complete Entity Relationship Diagram
Relationship Types
One-to-One (1:1)
users↔linkedin_meta- One user has one LinkedIn metausers↔twitter_meta- One user has one Twitter metausers↔twitter_enrichments- One user has one Twitter enrichmentusers↔crypto_enrichments- One user has one crypto enrichmentusers↔speakers- One user can be one speaker (optional)
One-to-Many (1:N)
users→connections- One user can have many connections (as requester or recipient)users→event_attendees- One user can attend many eventsusers→conference_attendees- One user can attend many conferencesusers→user_quest_tasks- One user can complete many quest tasksusers→user_notifications- One user can receive many notificationsconferences→events- One conference can have many eventsconferences→conference_attendees- One conference can have many attendeesconferences→conference_agenda- One conference can have many agenda itemsconferences→quests- One conference can have many questsquests→quest_tasks- One quest can have many tasksquests→user_quest_tasks- One quest can have many user progress recordsevents→event_attendees- One event can have many attendeesnotification_jobs→notification_job_items- One job can have many items
Many-to-Many (M:N)
users↔users(viaconnections) - Users can connect to many usersevents↔speakers(viaevent_speakers) - Events can have many speakers, speakers can be in many eventsconferences↔speakers(viaconference_speakers) - Conferences can have many speakers, speakers can be in many conferencesusers↔quests(viauser_quest_tasks) - Users can participate in many quests, quests can have many usersusers↔quests(viaquest_registration_requests) - Users can request registration for many quests
Foreign Key Constraints
Cascade Deletes
Most relationships use ON DELETE CASCADE to maintain referential integrity:
- Deleting a user deletes their connections, attendances, quest progress, etc.
- Deleting an event deletes its attendees
- Deleting a quest deletes its tasks and user progress
- Deleting a conference deletes its events, attendees, and agenda
Unique Constraints
(requester_id, recipient_id)inconnections- Prevents duplicate connections(event_id, user_id)inevent_attendees- One user per event(conference_id, user_id)inconference_attendees- One user per conference(user_id, quest_task_id)inuser_quest_tasks- One completion per task per user(user_id, quest_id)inquest_registration_requests- One registration request per quest per user(event_id, speaker_id)inevent_speakers- One speaker per event (with role)(conference_id, speaker_id)inconference_speakers- One speaker per conference (with role)
Indexes for Performance
User-Related Indexes
users.telegram_id- Unique index for fast user lookupconnections.requester_id,connections.recipient_id- Fast connection queriesevent_attendees.user_id- Fast user event lookupuser_quest_tasks.user_id- Fast quest progress lookup
Event-Related Indexes
events.status,events.date,events.is_featured- Fast event filteringevents.conference_id- Fast conference event lookupevent_attendees.event_id- Fast attendee lookup
Quest-Related Indexes
quests.featured,quests.category- Fast quest filteringquest_tasks.quest_id- Fast task lookupuser_quest_tasks.completed,user_quest_tasks.completed_at- Fast progress queries
Conference-Related Indexes
conferences.slug- Unique index for URL lookupconferences.status,conferences.start_date- Fast filteringconference_attendees.conference_id- Fast attendee lookup
Data Flow Patterns
User Registration Flow
- User created in
userstable - Optional: LinkedIn/Twitter meta created
- Optional: Enrichments generated
- User can register for events/conferences
- User can join quests
- User receives notifications
Quest Completion Flow
- User requests quest registration (if approval required)
- Admin approves/rejects in
quest_registration_requests - User starts quest, creates
user_quest_tasksrecords - User completes tasks, updates
user_quest_tasks - Admin verifies tasks (if required)
- Points awarded, progress tracked
- Quest completion triggers notifications
Event Attendance Flow
- Event created in
eventstable - Users register via
event_attendees - If capacity reached, users waitlisted
- Event status updated based on date
- Attendees can be queried for event
Notification Flow
- Admin creates
notification_jobwith criteria - System finds eligible users
- Creates
notification_job_itemsfor each user - Processes items, sends notifications
- Updates
user_notificationstable - Tracks success/failure in job items