-- CreateTable CREATE TABLE `users` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `email` VARCHAR(191) NOT NULL, `password` VARCHAR(191) NOT NULL, `nickname` VARCHAR(191) NOT NULL, `persona` ENUM('senior', 'mid', 'junior', 'crammer') NOT NULL DEFAULT 'mid', `currentGrade` INTEGER NULL, `targetGrade` INTEGER NULL, `reviewIntensity` ENUM('strict', 'moderate', 'relaxed') NOT NULL DEFAULT 'moderate', `onboardedAt` DATETIME(3) NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, UNIQUE INDEX `users_email_key`(`email`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `subjects` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `name` VARCHAR(191) NOT NULL, `color` VARCHAR(191) NOT NULL DEFAULT '#6366f1', `userId` INTEGER NOT NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `subjects_userId_idx`(`userId`), UNIQUE INDEX `subjects_userId_name_key`(`userId`, `name`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `tags` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `name` VARCHAR(191) NOT NULL, `subjectId` INTEGER NOT NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `tags_subjectId_idx`(`subjectId`), UNIQUE INDEX `tags_subjectId_name_key`(`subjectId`, `name`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `study_logs` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `userId` INTEGER NOT NULL, `subjectId` INTEGER NOT NULL, `tagId` INTEGER NULL, `title` VARCHAR(191) NOT NULL, `difficulty` DOUBLE NOT NULL, `baseCorrectRate` DOUBLE NULL, `result` ENUM('correct', 'incorrect', 'partial') NOT NULL, `memo` TEXT NULL, `studiedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `timeSpent` INTEGER NULL, INDEX `study_logs_userId_studiedAt_idx`(`userId`, `studiedAt`), INDEX `study_logs_subjectId_idx`(`subjectId`), INDEX `study_logs_tagId_idx`(`tagId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `review_schedules` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `userId` INTEGER NOT NULL, `studyLogId` INTEGER NOT NULL, `scheduledAt` DATETIME(3) NOT NULL, `reviewedAt` DATETIME(3) NULL, `result` ENUM('correct', 'incorrect', 'partial') NULL, `iteration` INTEGER NOT NULL DEFAULT 0, `predictedP` DOUBLE NULL, `status` ENUM('pending', 'done', 'skipped', 'expired') NOT NULL DEFAULT 'pending', `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, INDEX `review_schedules_userId_status_scheduledAt_idx`(`userId`, `status`, `scheduledAt`), INDEX `review_schedules_studyLogId_idx`(`studyLogId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `skill_snapshots` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `userId` INTEGER NOT NULL, `tagId` INTEGER NULL, `s0` DOUBLE NOT NULL, `lastUpdatedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `sampleCount` INTEGER NOT NULL DEFAULT 0, INDEX `skill_snapshots_userId_idx`(`userId`), UNIQUE INDEX `skill_snapshots_userId_tagId_key`(`userId`, `tagId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- AddForeignKey ALTER TABLE `subjects` ADD CONSTRAINT `subjects_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `tags` ADD CONSTRAINT `tags_subjectId_fkey` FOREIGN KEY (`subjectId`) REFERENCES `subjects`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `study_logs` ADD CONSTRAINT `study_logs_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `study_logs` ADD CONSTRAINT `study_logs_subjectId_fkey` FOREIGN KEY (`subjectId`) REFERENCES `subjects`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `study_logs` ADD CONSTRAINT `study_logs_tagId_fkey` FOREIGN KEY (`tagId`) REFERENCES `tags`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `review_schedules` ADD CONSTRAINT `review_schedules_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `review_schedules` ADD CONSTRAINT `review_schedules_studyLogId_fkey` FOREIGN KEY (`studyLogId`) REFERENCES `study_logs`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `skill_snapshots` ADD CONSTRAINT `skill_snapshots_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `skill_snapshots` ADD CONSTRAINT `skill_snapshots_tagId_fkey` FOREIGN KEY (`tagId`) REFERENCES `tags`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;