Database Schema
KnowledgeCheckr uses MySQL as its relational database with Drizzle ORM for type-safe database operations. The schema is defined indatabase/drizzle/schema.ts.
Core Entities
User
Stores user account information for both authenticated and anonymous users.id: UUID primary key (36 characters)name: User’s display nameemail: User’s email addressemailVerified: Boolean flag (0/1)image: Optional profile image URL (max 512 chars)isAnonymous: Distinguishes temporary anonymous users- Timestamps:
createdAt,updatedAt
Account
Stores OAuth provider information for social login integrations.- Foreign key:
userId→User.id(cascade delete)
- GitHub OAuth
- Google OAuth
- Dex (Generic OAuth)
- Email/Password
Session
Manages user authentication sessions.- Session token storage
- IP address tracking
- User agent tracking
- Expiration management
- Foreign key:
userId→User.id(cascade delete)
Verification
Handles email verification and password reset tokens.Knowledge Check Entities
KnowledgeCheck
The main entity representing a quiz or assessment.id: Auto-generated UUIDname: Check titledescription: Optional detailed descriptionowner_id: Creator user IDshare_key: Unique sharing token (50 chars)openDate: When check becomes availablecloseDate: Optional deadlinedifficulty: Numeric difficulty ratingexpiresAt: Optional expiration date
- Foreign key:
owner_id→User.id(cascade delete)
KnowledgeCheck_Settings
Configurable settings for examinations and practice modes.allowAnonymous: Permit anonymous users to take examsallowFreeNavigation: Allow jumping between questionsquestionOrder: Display order (create-orderorrandom)answerOrder: Answer display orderexamTimeFrameSeconds: Time limit in secondsexaminationAttemptCount: Maximum attempts allowedstartDate/endDate: Availability window
enablePracticing: Toggle practice modeallowedPracticeCount: Attempt limit (NULL = unlimited)
- Foreign key:
knowledgecheckId→KnowledgeCheck.id(cascade delete)
Category
Organizes questions into logical groups with optional prerequisites.- Unique constraint on
(knowledgecheckId, name)- prevents duplicate categories within a check - Self-referencing foreign key for
prequisiteCategoryId
- Foreign key:
knowledgecheckId→KnowledgeCheck.id(cascade delete) - Foreign key:
prequisiteCategoryId→Category.id(set null on delete)
Question
Individual assessment questions with multiple type support.single-choice: One correct answermultiple-choice: Multiple correct answersopen-question: Free-text responsedrag-drop: Order-based answer
all: Available in practice and examinationpractice-only: Only in practice modeexam-only: Only in examination mode
_position: Display order within the checkpoints: Score value for correct answer
- Foreign key:
categoryId→Category.id(cascade delete) - Foreign key:
knowledgecheckId→KnowledgeCheck.id(cascade delete)
Answer
Possible answers for questions.answer: The answer textcorrect: Boolean indicating correctness (for choice questions)position: Correct position (for drag-drop questions)_position: Display order
- Foreign key:
questionId→Question.id(cascade delete)
User Activity & Results
User_contributesTo_KnowledgeCheck
Many-to-many relationship for collaborators.User_has_done_KnowledgeCheck
Records completed assessments and results.type:practiceorexaminationstartedAt/finishedAt: Session duration trackingscore: Calculated scoreresults: JSON array of question responses
(id, userId, knowledgeCheckId)
Entity Relationship Diagram
Schema Conventions
UUID Generation
- Distributed system compatibility
- Security (non-sequential IDs)
- Easy data migration
Timestamps
createdAt: Set on insertupdatedAt: Updated on every modification- Stored as ISO string format
Foreign Key Actions
Cascade Delete: Used when child entities should be removed with parentAccount.userId→User.idKnowledgeCheck.owner_id→User.idQuestion.categoryId→Category.id
Category.prequisiteCategoryId→Category.id
Indexes
Foreign keys are automatically indexed:- Joins
- WHERE clauses on foreign keys
- CASCADE operations
Database Connection Management
Drizzle ORM Configuration
Location:database/Database.ts
- Connection health checking
- Automatic reconnection
- Development connection caching
- Production connection per request
Migration Management
Configuration:drizzle.config.ts
database/drizzle/migrations/
Query Examples
Fetching a Knowledge Check with Relations
Recording Examination Results
Data Integrity
Constraints
-
Unique Constraints:
KnowledgeCheck.share_key- Ensures unique sharing tokens(Category.knowledgecheckId, Category.name)- Prevents duplicate categories
- Foreign Key Constraints: All relationships enforced at database level
- NOT NULL Constraints: Required fields enforced
- Enum Constraints: Type-safe values for status fields
Validation Layers
- Database Level: Constraints and foreign keys
- ORM Level: Drizzle schema validation
- Application Level: Zod schemas (see
src/schemas/)
Performance Considerations
Indexing Strategy
- All foreign keys indexed automatically
- Composite primary keys for junction tables
- Unique indexes on share tokens
Query Optimization
- Use Drizzle’s query builder for efficient queries
- Leverage
withclause for eager loading - Avoid N+1 queries with proper joins
Connection Pooling
- Pool size: 10 connections
- Development: Cached global pool
- Production: New pool per deployment
Next Steps
- Authentication - User authentication implementation
- Architecture - System architecture overview