-- 任务模块 (V0.2): 项目 / 成员 / 看板列 / 任务 / 任务成员 / 标签 -- 设计口径见 docs/V0.2/任务模块/任务模块数据库设计文档.md -- CreateTable CREATE TABLE `Project` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, `ownerId` INTEGER NOT NULL, `isPersonal` BOOLEAN NOT NULL DEFAULT false, `archived` BOOLEAN NOT NULL DEFAULT false, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, INDEX `Project_ownerId_idx`(`ownerId`), INDEX `Project_archived_idx`(`archived`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `ProjectMember` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `projectId` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `permission` VARCHAR(191) NOT NULL DEFAULT 'member', `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), UNIQUE INDEX `ProjectMember_projectId_userId_key`(`projectId`, `userId`), INDEX `ProjectMember_userId_idx`(`userId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `BoardColumn` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `projectId` INTEGER NOT NULL, `name` VARCHAR(20) NOT NULL, `sortOrder` INTEGER NOT NULL DEFAULT 0, `boundStatus` VARCHAR(8) NULL, `retention` VARCHAR(8) NOT NULL DEFAULT 'forever', `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, UNIQUE INDEX `BoardColumn_projectId_name_key`(`projectId`, `name`), INDEX `BoardColumn_projectId_sortOrder_idx`(`projectId`, `sortOrder`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `Task` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `projectId` INTEGER NOT NULL, `columnId` INTEGER NOT NULL, `parentId` INTEGER NULL, `title` VARCHAR(200) NOT NULL, `description` TEXT NOT NULL, `status` VARCHAR(8) NOT NULL DEFAULT 'todo', `doneAt` DATETIME(3) NULL, `assigneeId` INTEGER NULL, `creatorId` INTEGER NOT NULL, `extras` JSON NOT NULL, `sortOrder` INTEGER NOT NULL DEFAULT 0, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, INDEX `Task_projectId_columnId_idx`(`projectId`, `columnId`), INDEX `Task_projectId_status_idx`(`projectId`, `status`), INDEX `Task_parentId_idx`(`parentId`), INDEX `Task_projectId_doneAt_idx`(`projectId`, `doneAt`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `TaskMember` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `taskId` INTEGER NOT NULL, `userId` INTEGER NOT NULL, UNIQUE INDEX `TaskMember_taskId_userId_key`(`taskId`, `userId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `TaskTag` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `taskId` INTEGER NOT NULL, `name` VARCHAR(20) NOT NULL, INDEX `TaskTag_taskId_idx`(`taskId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- AddForeignKey ALTER TABLE `Project` ADD CONSTRAINT `Project_ownerId_fkey` FOREIGN KEY (`ownerId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `ProjectMember` ADD CONSTRAINT `ProjectMember_projectId_fkey` FOREIGN KEY (`projectId`) REFERENCES `Project`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `ProjectMember` ADD CONSTRAINT `ProjectMember_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `BoardColumn` ADD CONSTRAINT `BoardColumn_projectId_fkey` FOREIGN KEY (`projectId`) REFERENCES `Project`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Task` ADD CONSTRAINT `Task_projectId_fkey` FOREIGN KEY (`projectId`) REFERENCES `Project`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Task` ADD CONSTRAINT `Task_columnId_fkey` FOREIGN KEY (`columnId`) REFERENCES `BoardColumn`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Task` ADD CONSTRAINT `Task_parentId_fkey` FOREIGN KEY (`parentId`) REFERENCES `Task`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Task` ADD CONSTRAINT `Task_assigneeId_fkey` FOREIGN KEY (`assigneeId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Task` ADD CONSTRAINT `Task_creatorId_fkey` FOREIGN KEY (`creatorId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `TaskMember` ADD CONSTRAINT `TaskMember_taskId_fkey` FOREIGN KEY (`taskId`) REFERENCES `Task`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `TaskMember` ADD CONSTRAINT `TaskMember_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `TaskTag` ADD CONSTRAINT `TaskTag_taskId_fkey` FOREIGN KEY (`taskId`) REFERENCES `Task`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;