Academic Suite 데이터베이스 설계
Source: Dev.to
데이터베이스는 Academic Suite의 기본 기반 역할을 합니다. 온라인 시험 시스템에서 부적절한 데이터베이스 스키마 설계는 특히 수백에서 수천 명의 학생이 거의 동시에 답안을 제출할 때 심각한 병목 현상을 초래할 수 있습니다.
이 장에서는 시스템 도메인 관점에서 데이터베이스 설계에 대해 논의하며, 데이터 스키마가 온라인 시험 시스템의 확장성, 일관성 및 가시성 요구를 어떻게 지원하는지에 초점을 맞춥니다.
2.1 데이터 모델 개요
Academic Suite는 PostgreSQL을 사용한 관계형 접근 방식으로 구축되었습니다. 이는 트랜잭션 처리, 복잡한 관계 관리 및 강력한 데이터 일관성을 제공하기 때문입니다.
데이터 모델은 네 가지 주요 그룹으로 나뉩니다:
- 조직 모델 – 기관, 사용자 및 클래스
- 학술 모델 – 과목, 퀴즈 및 문제 은행
- 시험 모델 – 시험 실행 및 학생 시도
- 감사 및 모니터링 모델 – 답변 및 부정 행위 방지 활동
이러한 구분은 책임을 분리하고 고급 기능 개발을 용이하게 합니다.
2.2 엔터티 관계 다이어그램 (ERD)
아래 다이어그램은 Academic Suite 시스템의 엔터티 간 주요 관계를 보여줍니다.
erDiagram
INSTITUTION ||--|{ USER : has
INSTITUTION ||--|{ SUBJECT : offers
USER ||--|{ CLASS : "teaches/enrolled"
USER ||--o{ ATTEMPT : takes
SUBJECT ||--|{ CLASS : has
SUBJECT ||--|{ QUIZ : contains
QUIZ ||--|{ QUESTION : contains
QUIZ ||--|{ EXAM_BATCH : scheduled_as
QUESTION ||--|{ OPTION : has
EXAM_BATCH ||--o{ ATTEMPT : records
CLASS ||--|{ EXAM_BATCH : participates_in
ATTEMPT ||--|{ ANSWER : contains
ATTEMPT ||--|{ EVENT_LOG : generates
이 ERD는 이 장 및 이후 장들 전반에 걸쳐 주요 참고 자료로 사용됩니다.
2.3 조직 모델 (User, Institution, Class)
Institution & User
모든 사용자는 하나의 기관에 연결되어야 하며, 이는 향후 확장을 위한 멀티‑테넌시를 가능하게 합니다.
Table institutions
id(PK)namecreated_at
Table users
id(PK)email(unique)role(admin,teacher,student)institution_id(FK)
이러한 관계는 초기 단계에서 과도한 복잡성을 추가하지 않으면서 기관 간 데이터 격리를 보장합니다.
Class
Class 엔터티는 학생들을 그룹화하고 시험 일정을 관리합니다.
student_ids는 학생 ID 배열을 포함하는 JSON Text 형태로 저장됩니다.
Design Decision
조인 테이블(class_students) 대신 JSON을 사용하는 이유는 시험 중 읽기 성능을 최적화하기 위함입니다. 높은 부하 상황에서 단일 행을 읽고 JSON을 파싱하는 것이 대규모 조인 테이블에 대해 JOIN을 수행하는 것보다 종종 더 빠릅니다. 이는 데이터베이스 수준에서 외래키 제약을 포기하는 것이며, 일관성 검증은 애플리케이션에서 수행합니다.
2.4 학술 모델 (Subject, Quiz, Question)
과목
기관에서 제공하는 과목을 나타냅니다.
퀴즈
Quiz는 시험 청사진 역할을 하며 전역 설정을 저장합니다:
time_limitpassing_scoreexam_type
질문 및 옵션
각 Question은 내용과 유형(mcq, essay 등)을 저장합니다. 객관식 질문의 경우, 답변 옵션은 별도의 테이블(question_options)에 저장되어 옵션 수에 대한 유연성을 제공하고 향후 질문 유형을 지원합니다.
2.5 시험 모델 (ExamBatch & Attempt)
ExamBatch (시험 세션)
ExamBatch는 퀴즈의 구체적인 실행을 나타냅니다.
- 하나의 퀴즈를 서로 다른 반에 대해 여러 번 일정에 잡을 수 있습니다.
- 시험 입장 코드로 사용되는
token을 포함합니다. - 라이프사이클 상태:
scheduled→active→finished.
Attempt (시험 시도)
학생이 시험을 시작할 때마다 Attempt 레코드가 생성됩니다.
주요 필드:
status:ACTIVE,SUBMITTEDremaining_time: 초 단위로 남은 시간의 스냅샷 (페이지 새로 고침이나 중단 후에도 일관성을 보장)score: 최종 점수
2.6 Answer & EventLog (Critical Data & Anti‑Cheating)
Answer
answers 테이블은 각 질문에 대한 학생의 답안을 저장합니다.
- 매우 큰 데이터 양
- 시험 중 높은 쓰기 강도
최적화: (attempt_id, question_id) 복합 인덱스를 사용하여 시험 페이지를 다시 로드할 때 쿼리를 빠르게 유지합니다.
EventLog
의심스러운 활동은 event_logs 테이블에 기록되며, 포함 항목:
FOCUS_LOSTTAB_SWITCHDEVICE_CHANGE
이 데이터는 이후 장에서 논의되는 실시간 모니터링 기능 및 시험 무결성 평가의 기반이 됩니다.
장 요약
우리는 조직 구조, 학술 모델, 시험 거래 모델 및 활동 로깅을 포괄하는 Academic Suite 데이터베이스 설계를 다루었습니다. 이 설계는 성능, 데이터 일관성 및 개발 유연성의 균형을 맞춥니다.
다음: Chapter 3 – 인증 및 인가 시스템 구축, 모든 Academic Suite 데이터와 기능에 대한 접근을 보호하는 주요 게이트웨이.