db만 구축했는데 안되면 되돌리셈
This commit is contained in:
313
prisma/schema.prisma
Normal file
313
prisma/schema.prisma
Normal file
@@ -0,0 +1,313 @@
|
||||
// This is your Prisma schema file,
|
||||
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
||||
|
||||
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
|
||||
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
|
||||
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
}
|
||||
|
||||
datasource db {
|
||||
provider = "postgresql"
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
// ============================================
|
||||
// 사용자 관련 모델
|
||||
// ============================================
|
||||
|
||||
/// 사용자 (User)
|
||||
/// 권한 설정 페이지, 로그인/회원가입에서 사용
|
||||
model User {
|
||||
id String @id @default(uuid())
|
||||
email String @unique // 이메일 (아이디로 사용)
|
||||
password String // 비밀번호 (해시화되어 저장)
|
||||
name String // 성명
|
||||
phone String? // 휴대폰 번호
|
||||
gender String? // 성별 (M/F)
|
||||
birthdate DateTime? // 생년월일
|
||||
role UserRole @default(LEARNER) // 권한: 학습자, 관리자
|
||||
status UserStatus @default(ACTIVE) // 계정 상태: 활성화, 비활성화
|
||||
joinDate DateTime @default(now()) // 가입일
|
||||
|
||||
// 관계
|
||||
createdCourses Course[] @relation("CourseCreator")
|
||||
instructedCourses Course[] @relation("CourseInstructor")
|
||||
createdLessons Lesson[] @relation("LessonCreator")
|
||||
createdNotices Notice[] @relation("NoticeWriter")
|
||||
enrollments Enrollment[] // 수강 등록
|
||||
certificates Certificate[] // 수료증
|
||||
logs Log[] // 로그 기록
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@index([email])
|
||||
@@index([role])
|
||||
@@index([status])
|
||||
@@map("users")
|
||||
}
|
||||
|
||||
enum UserRole {
|
||||
LEARNER // 학습자
|
||||
ADMIN // 관리자 (강사 권한 포함)
|
||||
}
|
||||
|
||||
enum UserStatus {
|
||||
ACTIVE // 활성화
|
||||
INACTIVE // 비활성화
|
||||
}
|
||||
|
||||
// ============================================
|
||||
// 교육과정 관련 모델
|
||||
// ============================================
|
||||
|
||||
/// 교육과정 (Course)
|
||||
/// 교육과정 관리 페이지에서 사용
|
||||
model Course {
|
||||
id String @id @default(uuid())
|
||||
courseName String // 교육과정명
|
||||
instructorId String // 강사 ID (User의 ADMIN 역할)
|
||||
instructor User @relation("CourseInstructor", fields: [instructorId], references: [id])
|
||||
createdById String // 등록자 ID
|
||||
createdBy User @relation("CourseCreator", fields: [createdById], references: [id])
|
||||
createdAt DateTime @default(now()) // 생성일
|
||||
|
||||
// 관계
|
||||
lessons Lesson[] // 강좌 목록
|
||||
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@index([instructorId])
|
||||
@@index([createdById])
|
||||
@@index([createdAt])
|
||||
@@map("courses")
|
||||
}
|
||||
|
||||
/// 강좌 (Lesson)
|
||||
/// 강좌 관리 페이지에서 사용
|
||||
model Lesson {
|
||||
id String @id @default(uuid())
|
||||
courseId String // 교육과정 ID
|
||||
course Course @relation(fields: [courseId], references: [id], onDelete: Cascade)
|
||||
lessonName String // 강좌명
|
||||
learningGoal String? @db.Text // 학습 목표 (최대 1000자)
|
||||
createdById String // 등록자 ID
|
||||
createdBy User @relation("LessonCreator", fields: [createdById], references: [id])
|
||||
createdAt DateTime @default(now()) // 등록일
|
||||
|
||||
// 관계
|
||||
videos LessonVideo[] // 강좌 영상
|
||||
vrContents LessonVRContent[] // VR 콘텐츠
|
||||
questions Question[] // 학습 평가 문제
|
||||
attachments LessonAttachment[] // 첨부파일
|
||||
enrollments Enrollment[] // 수강 등록
|
||||
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@index([courseId])
|
||||
@@index([createdById])
|
||||
@@index([createdAt])
|
||||
@@map("lessons")
|
||||
}
|
||||
|
||||
/// 강좌 영상 (LessonVideo)
|
||||
/// 강좌 등록 시 첨부되는 영상 파일 (최대 10개, 30MB 미만)
|
||||
model LessonVideo {
|
||||
id String @id @default(uuid())
|
||||
lessonId String // 강좌 ID
|
||||
lesson Lesson @relation(fields: [lessonId], references: [id], onDelete: Cascade)
|
||||
fileName String // 파일명
|
||||
filePath String // 파일 저장 경로
|
||||
fileSize Int // 파일 크기 (bytes)
|
||||
order Int // 순서
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
@@index([lessonId])
|
||||
@@map("lesson_videos")
|
||||
}
|
||||
|
||||
/// VR 콘텐츠 (LessonVRContent)
|
||||
/// 강좌 등록 시 첨부되는 VR 콘텐츠 파일 (최대 10개, 30MB 미만)
|
||||
model LessonVRContent {
|
||||
id String @id @default(uuid())
|
||||
lessonId String // 강좌 ID
|
||||
lesson Lesson @relation(fields: [lessonId], references: [id], onDelete: Cascade)
|
||||
fileName String // 파일명
|
||||
filePath String // 파일 저장 경로
|
||||
fileSize Int // 파일 크기 (bytes)
|
||||
order Int // 순서
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
@@index([lessonId])
|
||||
@@map("lesson_vr_contents")
|
||||
}
|
||||
|
||||
/// 강좌 첨부파일 (LessonAttachment)
|
||||
/// 강좌 관련 기타 첨부파일
|
||||
model LessonAttachment {
|
||||
id String @id @default(uuid())
|
||||
lessonId String // 강좌 ID
|
||||
lesson Lesson @relation(fields: [lessonId], references: [id], onDelete: Cascade)
|
||||
fileName String // 파일명
|
||||
filePath String // 파일 저장 경로
|
||||
fileSize Int // 파일 크기 (bytes)
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
@@index([lessonId])
|
||||
@@map("lesson_attachments")
|
||||
}
|
||||
|
||||
// ============================================
|
||||
// 학습 평가 관련 모델
|
||||
// ============================================
|
||||
|
||||
/// 문제 (Question)
|
||||
/// 문제 은행 페이지에서 사용, 강좌별 학습 평가 문제
|
||||
model Question {
|
||||
id String @id @default(uuid())
|
||||
lessonId String? // 강좌 ID (선택적, 문제 은행에만 있을 수도 있음)
|
||||
lesson Lesson? @relation(fields: [lessonId], references: [id], onDelete: SetNull)
|
||||
question String @db.Text // 문제 내용
|
||||
type QuestionType @default(MULTIPLE_CHOICE) // 문제 유형
|
||||
options Json? // 선택지 (객관식인 경우)
|
||||
correctAnswer String @db.Text // 정답
|
||||
explanation String? @db.Text // 해설
|
||||
points Int @default(1) // 배점
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@index([lessonId])
|
||||
@@map("questions")
|
||||
}
|
||||
|
||||
enum QuestionType {
|
||||
MULTIPLE_CHOICE // 객관식
|
||||
SHORT_ANSWER // 단답형
|
||||
ESSAY // 서술형
|
||||
}
|
||||
|
||||
// ============================================
|
||||
// 공지사항 관련 모델
|
||||
// ============================================
|
||||
|
||||
/// 공지사항 (Notice)
|
||||
/// 공지사항 관리 페이지에서 사용
|
||||
model Notice {
|
||||
id String @id @default(uuid())
|
||||
title String // 제목
|
||||
content String @db.Text // 내용 (최대 1000자)
|
||||
writerId String // 작성자 ID
|
||||
writer User @relation("NoticeWriter", fields: [writerId], references: [id])
|
||||
views Int @default(0) // 조회수
|
||||
hasAttachment Boolean @default(false) // 첨부파일 여부
|
||||
date DateTime @default(now()) // 게시일
|
||||
|
||||
// 관계
|
||||
attachment NoticeAttachment? // 첨부파일
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@index([writerId])
|
||||
@@index([date])
|
||||
@@map("notices")
|
||||
}
|
||||
|
||||
/// 공지사항 첨부파일 (NoticeAttachment)
|
||||
/// 공지사항에 첨부되는 파일 (최대 1개, 30MB 미만)
|
||||
model NoticeAttachment {
|
||||
id String @id @default(uuid())
|
||||
noticeId String @unique // 공지사항 ID
|
||||
notice Notice @relation(fields: [noticeId], references: [id], onDelete: Cascade)
|
||||
fileName String // 파일명
|
||||
filePath String // 파일 저장 경로
|
||||
fileSize Int // 파일 크기 (bytes)
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
@@map("notice_attachments")
|
||||
}
|
||||
|
||||
// ============================================
|
||||
// 학습 자료 관련 모델
|
||||
// ============================================
|
||||
|
||||
/// 학습 자료 (Resource)
|
||||
/// 학습 자료실 페이지에서 사용
|
||||
model Resource {
|
||||
id String @id @default(uuid())
|
||||
title String // 제목
|
||||
description String? @db.Text // 설명
|
||||
filePath String? // 파일 경로 (파일이 있는 경우)
|
||||
fileName String? // 파일명
|
||||
fileSize Int? // 파일 크기 (bytes)
|
||||
category String? // 카테고리
|
||||
views Int @default(0) // 조회수
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@index([category])
|
||||
@@index([createdAt])
|
||||
@@map("resources")
|
||||
}
|
||||
|
||||
// ============================================
|
||||
// 수강 및 수료 관련 모델
|
||||
// ============================================
|
||||
|
||||
/// 수강 등록 (Enrollment)
|
||||
/// 사용자가 강좌를 수강하는 관계
|
||||
model Enrollment {
|
||||
id String @id @default(uuid())
|
||||
userId String // 사용자 ID
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
lessonId String // 강좌 ID
|
||||
lesson Lesson @relation(fields: [lessonId], references: [id], onDelete: Cascade)
|
||||
progress Int @default(0) // 학습 진행률 (0-100)
|
||||
completedAt DateTime? // 완료일
|
||||
enrolledAt DateTime @default(now()) // 등록일
|
||||
|
||||
@@unique([userId, lessonId])
|
||||
@@index([userId])
|
||||
@@index([lessonId])
|
||||
@@map("enrollments")
|
||||
}
|
||||
|
||||
/// 수료증 (Certificate)
|
||||
/// 수료증 발급/검증키 관리 페이지에서 사용
|
||||
model Certificate {
|
||||
id String @id @default(uuid())
|
||||
userId String // 사용자 ID
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
lessonId String? // 강좌 ID (강좌 완료 시 발급)
|
||||
courseId String? // 교육과정 ID (과정 완료 시 발급)
|
||||
verificationKey String @unique // 검증 키
|
||||
issuedAt DateTime @default(now()) // 발급일
|
||||
|
||||
@@index([userId])
|
||||
@@index([verificationKey])
|
||||
@@map("certificates")
|
||||
}
|
||||
|
||||
// ============================================
|
||||
// 로그 관련 모델
|
||||
// ============================================
|
||||
|
||||
/// 로그 (Log)
|
||||
/// 로그/접속 기록 페이지에서 사용
|
||||
model Log {
|
||||
id String @id @default(uuid())
|
||||
userId String? // 사용자 ID (로그인한 경우)
|
||||
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
|
||||
action String // 액션 (예: LOGIN, LOGOUT, VIEW_LESSON, etc.)
|
||||
ipAddress String? // IP 주소
|
||||
userAgent String? // User Agent
|
||||
details Json? // 추가 상세 정보
|
||||
createdAt DateTime @default(now()) // 기록 시간
|
||||
|
||||
@@index([userId])
|
||||
@@index([action])
|
||||
@@index([createdAt])
|
||||
@@map("logs")
|
||||
}
|
||||
Reference in New Issue
Block a user