AP 과목 A #13: 데이터베이스 키, 함수 종속, 정규화

응용정보기술자시험 과목 A에 필요한 후보키·주키·외래키, 속성 폐포, 완전·부분·이행 함수 종속, 갱신 이상, 1NF~3NF 정규화와 무손실 분해, BCNF의 경계를 풀이 예제와 오리지널 연습 문제 5문항으로 익힙니다.

応用情報技術者試験科目Aデータベース正規化関数従属

AP 과목 A 제13편 · 2026년도·실라버스 Ver.7.2 기준의 독립 학습 자료입니다. IPA와 제휴하지 않으며 합격을 보장하지 않습니다. 시리즈 허브 보기

IPA와 무관한 독자 학습 노트이며, 제3자 해설을 옮기지 않았고, 기출문제를 사용하지 않았으며, 합격을 보장하지 않습니다.

학습 인덱스

1. 공식 출제 범위

  • 출처: IPA 応用情報技術者試験(レベル3)シラバス Ver.7.2 — https://www.ipa.go.jp/shiken/syllabus/omgdg50000005kq5-att/syllabus_ap_ver7_2.pdf (2026-10-21 확인, 데이터베이스 설계·정규화는 PDF 42–43쪽(인쇄 38–39쪽), 데이터 중심 설계는 PDF 67쪽(인쇄 63쪽))
  • 계층 매핑:
    • 大分類3 技術要素 › 中分類9 データベース › 2. データベース設計
      • (1) データ分析 — 용어 예: データ重複の排除
      • (2) データベースの設計 › ③ データベースの論理設計 — 主キー・外部キー, 一貫性制約(一意性制約, 参照制約, 検査制約)
      • (3) データの正規化 — 第1正規形, 第2正規形, 第3正規形など; 용어 예: 完全関数従属, 部分関数従属, 推移関数従属
      • (4) データベースのパフォーマンス設計 — 非正規化
    • 大分類4 開発技術 › 中分類12 システム開発技術 › 2. 設計 › (9)ソフトウェア設計手法 › ② データ中心設計 — 데이터 중심 설계 용어 예: 正規化, 一事実一箇所
  • BCNF 관련 주의: 실라버스 표현은 “第1正規形,第2正規形,第3正規形など”(제1·제2·제3정규형 등)입니다. BCNF를 명시적으로 거명하지 않습니다. 이 노트에서 BCNF는 그 “등”에 해당하는 보충 심화로만 다룹니다.
  • 이번 범위 밖: SQL 구문·질의(AP14). 스키마와 함수 종속은 관계 표기로만 씁니다.

2. 용어 대조표 (KO / JA / EN)

한국어 日本語 English
후보키 候補キー candidate key
주키(기본키) 主キー primary key
외래키 外部キー foreign key
슈퍼키 スーパーキー superkey
주요 속성(키 속성) / 비주요 속성 主属性(キー属性)/非キー属性 prime / non-prime attribute
함수 종속 関数従属性 functional dependency (FD)
결정자 / 종속자 決定項 / 従属項 determinant / dependent
속성 폐포 属性閉包 attribute closure
완전 함수 종속 完全関数従属 full functional dependency
부분 함수 종속 部分関数従属 partial functional dependency
이행 함수 종속 推移関数従属 transitive functional dependency
갱신 이상 / 삽입 이상 / 삭제 이상 更新時異状 / 挿入時異状 / 削除時異状 update / insertion / deletion anomaly
정규형 正規形 normal form
무손실 분해 無損失分解 lossless(-join) decomposition
종속성 보존 従属性保存 dependency preservation
참조 무결성 参照整合性(参照制約) referential integrity
비정규화 非正規化 denormalization

3. 메인 예제와 전제

ENROLLMENT_RAW(StudentID, CourseID, StudentName, CourseTitle,
               InstructorID, InstructorName, Grade)

함수 종속 집합 F:

  1. StudentID -> StudentName
  2. CourseID -> CourseTitle, InstructorID
  3. InstructorID -> InstructorName
  4. (StudentID, CourseID) -> Grade

업무 전제: 하나의 ID는 한 명의 학생을 식별한다. 한 과목에는 하나의 과목명과 한 명의 담당 교원이 있다. 하나의 교원 ID에는 하나의 이름이 있다. 한 학생은 한 과목에 대해 최대 하나의 성적을 가진다. 모든 값은 원자값이다(출발 릴레이션은 이미 1NF). 그 밖의 비자명한 함수 종속은 가정하지 않는다.

샘플 행(이상 현상 설명용):

StudentID CourseID StudentName CourseTitle InstructorID InstructorName Grade
S01 C10 Kim Database I7 Tanaka A
S02 C10 Lee Database I7 Tanaka B
S01 C20 Kim Networks I8 Sato B

4. 키와 속성 폐포

정의

  • 슈퍼키: 그 값이 릴레이션의 모든 속성을 결정하는 속성 집합.
  • 후보키: 최소 슈퍼키. 어느 속성 하나라도 빼면 더 이상 슈퍼키가 아니다.
  • 주키: 튜플 식별용으로 선택한 하나의 후보키(NULL 불가, 유일).
  • 외래키: 그 값이 참조 대상 릴레이션의 후보키 / 유일키 값과 일치해야 하는 속성 집합(보통은 주키지만 반드시 그런 것은 아니다). 참조 무결성을 보장한다.

폐포 알고리즘

X⁺ 계산: X에서 출발해, F의 각 Y -> Z에 대해 Y가 현재 집합에 포함되면 Z를 추가한다. 한 바퀴 돌아도 새로 추가되는 것이 없으면 멈춘다.

{StudentID, CourseID}+:

단계 적용한 FD 단계 후 집합
시작 — {StudentID, CourseID}
1 StudentID -> StudentName + StudentName
2 CourseID -> CourseTitle, InstructorID + CourseTitle, InstructorID
3 InstructorID -> InstructorName + InstructorName
4 (StudentID, CourseID) -> Grade + Grade
다음 바퀴 추가 없음 7개 속성 전부
  • {CourseID}+ = {CourseID, CourseTitle, InstructorID, InstructorName} 뿐.
  • {StudentID}+ = {StudentID, StudentName} 뿐.

(StudentID, CourseID)가 유일한 후보키인 이유

  1. StudentID와 CourseID는 F의 어떤 FD의 오른쪽에도 나오지 않으므로 다른 속성으로부터 도출될 수 없다. 모든 키는 둘을 반드시 포함한다.
  2. {StudentID, CourseID}+가 7개 속성 전부 → 슈퍼키.
  3. 어느 쪽을 빼도 실패(위의 {StudentID}+, {CourseID}+는 불완전) → 최소.
  4. 다른 슈퍼키는 이 쌍에 속성을 더한 것이므로 최소가 아니다.

따라서 F 아래에서 (StudentID, CourseID)는 유일한 후보키이며, 이를 주키로 선택한다. 주요 속성: StudentID, CourseID. 비주요 속성: 나머지 5개.

5. 함수 종속의 분류

복합 후보키 K = (StudentID, CourseID) 기준:

종류 종속 이유
완전 함수 종속 K -> Grade StudentID 단독으로도, CourseID 단독으로도 Grade를 결정하지 못한다.
부분 함수 종속 StudentID -> StudentName 비주요 속성이 K의 진부분집합에 종속된다.
부분 함수 종속 CourseID -> CourseTitle, InstructorID 마찬가지로 K의 일부가 결정자이다.
이행 함수 종속 CourseID -> InstructorID -> InstructorName InstructorName은 비키 속성 InstructorID를 경유하여 CourseID에 종속된다.

정확성 메모:

  • CourseID -> InstructorName은 주어진 FD가 아니라 이행 규칙으로 추론된 종속이다. 원래 릴레이션에서 InstructorName은 K의 일부에 부분적이면서 이행적으로 종속된다. 추론된 종속을 모두 직접(주어진) FD라고 부르지 말 것.
  • 2NF 릴레이션 COURSE_2NF(7절)에서는 CourseID가 키이므로 CourseID -> InstructorID -> InstructorName은 비키 속성을 경유한, 키에 대한 비주요 속성의 이행 종속이다.
  • 결정자 = 왼쪽, 종속자 = 오른쪽. “X -> Y”는 “X가 Y를 결정한다 / Y는 X에 함수 종속된다”로 읽는다.

6. 갱신 이상

세 가지 모두 중복(같은 사실이 여러 행에 저장)과 사실의 혼재(학생·과목·교원·수강 사실이 한 릴레이션에 섞임)에서 비롯된다.

  • 갱신 이상: Tanaka(I7)가 두 행에 저장되어 있다. 한 행만 이름을 바꾸면 데이터가 모순된다.
  • 삽입 이상: I9가 담당하는 새 과목 C30은 누군가 수강할 때까지 저장할 수 없다. 주키 (StudentID, CourseID)가 완전해야 하기 때문이다(StudentID에 NULL 불가).
  • 삭제 이상: S01이 C20 수강을 취소하고 그것이 C20의 마지막 수강이라면, 행 삭제와 함께 “C20 = Networks, 담당 I8 Sato”라는 사실도 사라진다.

7. 1NF → 2NF → 3NF

  • 1NF: 모든 속성 값이 원자값(반복 그룹 없음). ENROLLMENT_RAW는 이미 1NF이며 — 위의 이상 현상은 그대로 남아 있다. 1NF만으로는 부분·이행 종속이 제거되지 않는다.
  • 2NF: 1NF이고, 모든 비주요 속성이 모든 후보키에 완전 종속(부분 종속 없음).
  • 3NF: 2NF이고, 어떤 비주요 속성도 후보키에 이행 종속하지 않음. 동치 판정: 모든 비자명한 X -> A에 대해 X가 슈퍼키이거나, A가 주요 속성.
  • BCNF: 모든 비자명한 X -> A에 대해 X가 슈퍼키(“A가 주요 속성” 예외를 제거).

2NF 분해 (부분 종속 제거)

STUDENT(StudentID PK, StudentName)
COURSE_2NF(CourseID PK, CourseTitle, InstructorID, InstructorName)
ENROLLMENT(StudentID PK/FK, CourseID PK/FK, Grade)   -- 복합 PK (StudentID, CourseID)

ENROLLMENT에서 부분 종속은 사라졌다. 그러나 COURSE_2NF에는 이행 종속 CourseID -> InstructorID -> InstructorName이 남아 있다(교원 이름이 과목마다 반복).

3NF / 최종 분해 (이행 종속 제거)

STUDENT(StudentID PK, StudentName)
INSTRUCTOR(InstructorID PK, InstructorName)
COURSE(CourseID PK, CourseTitle, InstructorID FK -> INSTRUCTOR.InstructorID)
ENROLLMENT(StudentID FK -> STUDENT.StudentID,
           CourseID  FK -> COURSE.CourseID,
           Grade,
           PK(StudentID, CourseID))

FK 방향: “다” 쪽이 “일” 쪽을 참조한다 — ENROLLMENT → STUDENT, ENROLLMENT → COURSE, COURSE → INSTRUCTOR.

각 테이블에 사영된 FD 아래에서 모든 결정자는 슈퍼키다(STUDENT의 StudentID, INSTRUCTOR의 InstructorID, COURSE의 CourseID, ENROLLMENT의 (StudentID, CourseID)). 따라서 최종 테이블은 모두 3NF 이면서 BCNF이다.

최종 스키마는 각 사실을 한 곳에 저장한다(“一事実一箇所”): Tanaka의 이름은 INSTRUCTOR에서 한 번만 바꾸면 되고, C30은 수강 없이 COURSE에 넣을 수 있으며, 수강을 삭제해도 과목 데이터가 사라지지 않는다.

성능 메모: 정규화가 항상 질의를 빠르게 하지는 않는다 — 조회 시 조인이 늘 수 있다. 비정규화(非正規化)는 무결성 요구를 이해한 뒤 측정에 근거해 의도적으로 선택하는 성능 트레이드오프이지 기본값이 아니다.

8. 무손실 분해와 종속성 보존

판정 기준: R을 R1, R2로 분해할 때 (R1 ∩ R2) -> R1 또는 (R1 ∩ R2) -> R2가 F로부터 도출되면 무손실이다(공통 속성이 적어도 한쪽의 키).

단계별 이분할:

단계 분해 R1 ∩ R2 확인 결과
1 RAW → STUDENT + REST1(StudentID, CourseID, CourseTitle, InstructorID, InstructorName, Grade) StudentID StudentID -> {StudentID, StudentName} = STUDENT 전체 무손실
2 REST1 → COURSE_2NF + ENROLLMENT CourseID CourseID -> {CourseID, CourseTitle, InstructorID, InstructorName} = COURSE_2NF 전체 무손실
3 COURSE_2NF → COURSE + INSTRUCTOR InstructorID InstructorID -> {InstructorID, InstructorName} = INSTRUCTOR 전체 무손실

각 단계가 무손실이므로 단계적 최종 분해는 F 아래에서 무손실이다. 키·외래키 조건을 만족하는 데이터라면 자연 조인 ENROLLMENT ⋈ STUDENT ⋈ COURSE ⋈ INSTRUCTOR가 원래 튜플을 정확히 복원한다 — 잃는 튜플도, 가짜(spurious) 튜플도 없다.

종속성 보존 — F의 모든 FD를 최종 테이블 하나 안에서 검사할 수 있다:

FD 검사 위치
StudentID -> StudentName STUDENT
CourseID -> CourseTitle, InstructorID COURSE
InstructorID -> InstructorName INSTRUCTOR
(StudentID, CourseID) -> Grade ENROLLMENT

9. BCNF의 경계 (보충 심화)

(실라버스의 “第3正規形など”에 대한 보충 심화이며, 실라버스에 BCNF라는 이름은 없다.)

TEACH(Student, Subject, Instructor)
FD(이것뿐): (Student, Subject) -> Instructor
            Instructor -> Subject
  • 후보키: (Student, Subject)와 (Student, Instructor) — {Student, Instructor}+는 Instructor -> Subject로 Subject가 추가된다. 모든 속성이 주요 속성이다.
  • Instructor -> Subject: Subject가 주요 속성 → 3NF 만족. Instructor는 슈퍼키가 아님 → BCNF 위반.
  • BCNF 분해: INSTRUCTOR_SUBJECT(Instructor, Subject)와 STUDENT_INSTRUCTOR(Student, Instructor). 공통 속성 Instructor가 INSTRUCTOR_SUBJECT 전체를 결정하므로 무손실.
  • 트레이드오프: (Student, Subject) -> Instructor는 더 이상 한 릴레이션 안에 담기지 않으므로 보존되지 않는다. 이를 강제하려면 추가 제약이나 검사가 필요할 수 있다. 모든 BCNF 분해가 모든 종속을 보존하는 것은 아니다. 반면 3NF 분해는 항상 무손실이면서 종속성 보존이 되도록 만들 수 있다.

10. 요약 시트

  • 후보키 = 최소 슈퍼키, 주키 = 선택된 후보키, 외래키 → 다른 릴레이션의 후보키/유일키(참조 무결성).
  • X⁺: 새로 추가되는 것이 없을 때까지 F 반복 적용. X⁺ = 전체 속성 → X는 슈퍼키.
  • 어느 FD의 오른쪽에도 없는 속성 → 모든 키에 포함.
  • 완전: 키 전체에 종속. 부분: 복합키의 일부에 종속. 이행: 키 → 비키 → 비키.
  • 1NF 원자값 → 2NF 부분 종속 없음 → 3NF 이행 종속 없음(X 슈퍼키 또는 A 주요 속성) → BCNF(X 슈퍼키).
  • 무손실 이분할: (R1 ∩ R2) -> R1 또는 -> R2.
  • 종속성 보존: 각 FD를 한 테이블 안에서 검사 가능.
  • 메인 예제 최종형: STUDENT, INSTRUCTOR, COURSE(→INSTRUCTOR), ENROLLMENT(→STUDENT, →COURSE).

11. 자주 하는 실수

  • “1NF면 이상 현상이 없다” — 틀림. ENROLLMENT_RAW는 1NF이지만 세 이상이 모두 있다.
  • 최소가 아닌 슈퍼키(예: StudentID, CourseID, Grade)를 후보키라고 부름.
  • 단일 속성 키에서도 부분 종속이 있다고 생각함 — 부분 종속은 복합키에서만 생긴다.
  • InstructorID -> InstructorName을 “부분 종속”이라고 부름 — InstructorID는 K의 일부가 아니다.
  • “외래키는 반드시 주키를 참조한다” — 후보키/유일키를 참조한다(보통은 주키).
  • 어느 쪽도 결정하지 못하는 속성(공통 속성 없음, 중복 가능한 이름 등)으로 분해 → 가짜 튜플.
  • “BCNF 분해는 항상 종속성을 보존한다” — 틀림(TEACH).
  • “정규화는 항상 성능을 높인다” — 틀림. 비정규화는 측정에 근거한 트레이드오프.

12. 연습 문제 (5문항, 오리지널)

이 노트를 위해 새로 작성한 문제이며, IPA 기출문제가 아닙니다.

문제 1

F 아래의 ENROLLMENT_RAW에 대해 옳은 설명은?

  • ア {CourseID}+가 7개 속성을 모두 포함하므로 CourseID 단독이 후보키이다.
  • イ {StudentID, CourseID}+는 7개 속성을 모두 포함하고, {StudentID}+와 {CourseID}+는 그렇지 않으므로 (StudentID, CourseID)는 후보키이다.
  • ウ (StudentID, CourseID, Grade)는 폐포가 7개 속성을 모두 포함하므로 후보키이다.
  • エ InstructorID가 InstructorName을 결정하므로 (StudentID, InstructorID)도 후보키이다.

정답: イ

  • ア 오답. {CourseID}+ = {CourseID, CourseTitle, InstructorID, InstructorName}. StudentID, StudentName, Grade가 없다.
  • イ 정답. 폐포가 완전하고, 어느 한쪽을 빼면 폐포가 불완전해지므로 최소 슈퍼키다.
  • ウ 오답. 슈퍼키이지만 최소가 아니다. Grade를 뺄 수 있다.
  • エ 오답. {StudentID, InstructorID}+ = {StudentID, StudentName, InstructorID, InstructorName}. CourseID는 어떤 오른쪽에도 없으므로 도출되지 않는다.

문제 2

K = (StudentID, CourseID) 기준으로 옳은 분류는?

  • ア StudentID가 K의 일부이므로 K -> Grade는 부분 함수 종속이다.
  • イ StudentName이 비키 속성이므로 StudentID -> StudentName은 이행 함수 종속이다.
  • ウ K -> Grade는 완전, StudentID -> StudentName은 부분이며, InstructorName은 비키 속성 InstructorID를 경유해 CourseID에 이행 종속한다.
  • エ InstructorID가 K의 일부이므로 InstructorID -> InstructorName은 K에 대한 부분 함수 종속이다.

정답: ウ

  • ア 오답. Grade는 K 전체가 필요하고 어느 일부만으로는 결정되지 않으므로 완전 종속이다.
  • イ 오답. 결정자 StudentID는 K의 진부분집합이고 중간 비키 속성이 없으므로 이행이 아니라 부분 종속이다.
  • ウ 정답. 세 분류 모두 정의와 일치한다(CourseID -> InstructorID -> InstructorName이 이행 연쇄).
  • エ 오답. InstructorID는 K의 일부가 아니라 비키 속성이다. 이 FD는 이행 연쇄의 두 번째 고리다.

문제 3

PK/FK 방향까지 포함해 옳은 3NF 최종 분해는?

  • ア STUDENT(StudentID PK, StudentName), COURSE(CourseID PK, CourseTitle, InstructorID, InstructorName), ENROLLMENT(StudentID FK, CourseID FK, Grade, PK(StudentID, CourseID))
  • イ STUDENT(StudentID PK, StudentName), INSTRUCTOR(InstructorID PK, InstructorName, CourseID FK -> COURSE), COURSE(CourseID PK, CourseTitle), ENROLLMENT(StudentID FK, CourseID FK, Grade, PK(StudentID, CourseID))
  • ウ STUDENT(StudentID PK, StudentName), INSTRUCTOR(InstructorID PK, InstructorName), COURSE(CourseID PK, CourseTitle, InstructorID FK -> INSTRUCTOR), ENROLLMENT(StudentID PK, CourseID FK -> COURSE, Grade)
  • エ STUDENT(StudentID PK, StudentName), INSTRUCTOR(InstructorID PK, InstructorName), COURSE(CourseID PK, CourseTitle, InstructorID FK -> INSTRUCTOR), ENROLLMENT(StudentID FK -> STUDENT, CourseID FK -> COURSE, Grade, PK(StudentID, CourseID))

정답: エ

  • ア 오답. 2NF까지만 되었다. COURSE에 CourseID -> InstructorID -> InstructorName이 남아 있다.
  • イ 오답. FK 방향이 반대다. InstructorID -> CourseID는 F에 없으며(한 교원이 여러 과목 담당 가능), CourseID -> InstructorID를 한 테이블에서 검사할 수 없게 된다.
  • ウ 오답. StudentID 단독은 ENROLLMENT의 키가 아니며(한 학생이 여러 과목 수강), STUDENT로의 FK도 빠져 있다.
  • エ 정답. 모든 FD가 한 테이블 안에 있고, 모든 결정자가 키이며, FK가 “다” 쪽에서 “일” 쪽을 향한다.

문제 4

분해 단계가 무손실임을 바르게 증명한 것은?

  • ア COURSE_2NF를 COURSE(CourseID, CourseTitle, InstructorID)와 INSTRUCTOR(InstructorID, InstructorName)로 나누는 것은, 공통 속성 InstructorID가 INSTRUCTOR의 모든 속성을 결정하므로 무손실이다.
  • イ ENROLLMENT_RAW를 STUDENT와 REST1로 나누는 것은, 두 릴레이션의 튜플 수가 같으므로 무손실이다.
  • ウ ENROLLMENT_RAW를 R1(StudentID, StudentName, Grade)와 R2(CourseID, CourseTitle, InstructorID, InstructorName)로 나누는 것은, 각각 고유한 결정자를 가지므로 무손실이다.
  • エ COURSE_2NF를 (CourseID, CourseTitle, InstructorName)과 (InstructorID, InstructorName)으로 나누는 것은, 공통 속성이 InstructorName이므로 무손실이다.

정답: ア

  • ア 정답. (R1 ∩ R2) = InstructorID이고, InstructorID -> R2가 F로부터 도출된다.
  • イ 오답. 튜플 수는 판정 기준이 아니다(STUDENT는 보통 튜플이 더 적다). 올바른 근거는 StudentID -> STUDENT이다.
  • ウ 오답. 공통 속성이 없어 조인이 카티션 곱이 되고 가짜 튜플이 생긴다. 학생–과목 연결이 사라진다.
  • エ 오답. InstructorName -> InstructorID는 F에 없으므로(이름은 중복 가능) 공통 속성이 어느 쪽도 결정하지 못한다.

문제 5

FD가 (Student, Subject) -> Instructor와 Instructor -> Subject뿐인 TEACH(Student, Subject, Instructor)에 대해 옳은 것은?

  • ア Instructor -> Subject가 부분 종속이므로 TEACH는 2NF를 위반한다.
  • イ 모든 속성이 주요 속성이므로 TEACH는 BCNF이다.
  • ウ TEACH는 3NF이지만 BCNF는 아니다. INSTRUCTOR_SUBJECT(Instructor, Subject)와 STUDENT_INSTRUCTOR(Student, Instructor)로의 분해는 무손실이지만, (Student, Subject) -> Instructor는 한 릴레이션 안에 보존되지 않는다.
  • エ (Student, Subject)와 (Student, Instructor)로 분해하면 무손실이고 모든 종속이 보존된다.

정답: ウ

  • ア 오답. 2NF·3NF는 비주요 속성에 대한 제약이다. Subject는 주요 속성이므로 TEACH는 2NF이자 3NF이다.
  • イ 오답. BCNF는 모든 비자명한 결정자가 슈퍼키여야 한다. Instructor는 슈퍼키가 아니다.
  • ウ 정답. Subject가 주요 속성이라 3NF는 만족, BCNF는 위반. Instructor를 통해 무손실이지만 원래 FD는 추가 제약/검사가 필요할 수 있다.
  • エ 오답. 공통 속성 Student는 어느 쪽도 결정하지 못하므로 손실 분해다(가짜 튜플).

정답 일람: イ, ウ, エ, ア, ウ (1부터 번호: 2, 3, 4, 1, 3)

13. 셀프 체크와 1/3/7일 복습

셀프 체크:

  • 메모 없이 F로부터 {StudentID, CourseID}+, {CourseID}+, {StudentID}+를 계산할 수 있다.
  • 이 쌍이 유일한 후보키인 이유(오른쪽 논증 + 최소성)를 설명할 수 있다.
  • 완전/부분/이행 종속을 구분하고, 추론된 CourseID -> InstructorName을 설명할 수 있다.
  • 샘플 행으로 갱신·삽입·삭제 이상을 하나씩 들 수 있다.
  • 2NF·3NF 스키마를 PK/FK 방향까지 쓸 수 있다.
  • 3NF·BCNF 조건과 무손실 이분할 기준을 말할 수 있다.
  • TEACH가 3NF이지만 BCNF가 아닌 이유와 BCNF 분해로 잃는 것을 설명할 수 있다.

복습 계획:

  • 1일차: 4–5절을 종이에 다시 풀기. 문제 1–2 재도전.
  • 3일차: 2NF/3NF 스키마와 무손실 3단계를 기억으로 다시 쓰기. 문제 3–4 재도전.
  • 7일차: TEACH 트레이드오프를 소리 내어 설명하기. 5문항 전부 다시 풀고 틀린 선택지 해설 복습.

14. 개정 이력

  • 2026-10-28: 데이터 중심 설계의 공식 계층을 大分類4:開発技術/中分類12:システム開発技術/2. 設計/(9)ソフトウェア設計手法/② データ中心設計로 정정하고, 출처 쪽수를 데이터베이스 설계·정규화는 PDF 42–43쪽(인쇄 38–39쪽), 데이터 중심 설계는 PDF 67쪽(인쇄 63쪽)으로 바로잡았으며, 시리즈 메타데이터의 실라버스 범위에 이 항목을 추가했다. 본문 설명, 연습 문제와 정답은 바꾸지 않았다.

블로그로