CREATE TABLE `sync_job` ( `id` INT NOT NULL AUTO_INCREMENT, `sync_type` VARCHAR(30) NOT NULL, `trigger_mode` VARCHAR(30) NOT NULL, `status` VARCHAR(20) NOT NULL DEFAULT 'success', `operator` VARCHAR(50) NULL, `summary` TEXT NULL, `result_payload` TEXT NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (`id`), INDEX `sync_job_sync_type_created_at_idx`(`sync_type`, `created_at`), INDEX `sync_job_status_created_at_idx`(`status`, `created_at`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE `sync_change` ( `id` INT NOT NULL AUTO_INCREMENT, `sync_job_id` INT NOT NULL, `entity_type` VARCHAR(20) NOT NULL, `entity_key` VARCHAR(100) NULL, `entity_name` VARCHAR(100) NOT NULL, `change_type` VARCHAR(50) NOT NULL, `title` VARCHAR(150) NOT NULL, `detail` TEXT NULL, `before_snapshot` TEXT NULL, `after_snapshot` TEXT NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (`id`), INDEX `sync_change_sync_job_id_idx`(`sync_job_id`), INDEX `sync_change_entity_type_change_type_idx`(`entity_type`, `change_type`), CONSTRAINT `sync_change_sync_job_id_fkey` FOREIGN KEY (`sync_job_id`) REFERENCES `sync_job`(`id`) ON DELETE CASCADE ON UPDATE CASCADE ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE `notification` ( `id` INT NOT NULL AUTO_INCREMENT, `title` VARCHAR(150) NOT NULL, `content` TEXT NULL, `type` VARCHAR(30) NOT NULL DEFAULT 'info', `level` VARCHAR(20) NOT NULL DEFAULT 'info', `action_url` VARCHAR(255) NULL, `related_sync_job_id` INT NULL, `metadata` TEXT NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (`id`), INDEX `notification_related_sync_job_id_idx`(`related_sync_job_id`), INDEX `notification_created_at_idx`(`created_at`), CONSTRAINT `notification_related_sync_job_id_fkey` FOREIGN KEY (`related_sync_job_id`) REFERENCES `sync_job`(`id`) ON DELETE SET NULL ON UPDATE CASCADE ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE TABLE `user_notification` ( `id` INT NOT NULL AUTO_INCREMENT, `user_id` INT NOT NULL, `notification_id` INT NOT NULL, `is_read` BOOLEAN NOT NULL DEFAULT false, `read_at` DATETIME(3) NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (`id`), UNIQUE INDEX `user_notification_user_id_notification_id_key`(`user_id`, `notification_id`), INDEX `user_notification_user_id_is_read_created_at_idx`(`user_id`, `is_read`, `created_at`), CONSTRAINT `user_notification_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `user_notification_notification_id_fkey` FOREIGN KEY (`notification_id`) REFERENCES `notification`(`id`) ON DELETE CASCADE ON UPDATE CASCADE ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;