6월 14일-정규화

Yullgiii·2024년 6월 14일
0
post-thumbnail

Anomaly

정규화를 해야 하는 이유는 잘못된 테이블 설계로 인해 Anomaly(이상 현상)가 나타나기 때문이다. 여기서 Anomaly가 무엇인지 알아보자.

Anomaly의 종류

1. 삽입 이상(Insertion Anomaly)

기본키가 {Student ID, Course ID}인 경우, Course를 수강하지 않은 학생은 Course ID가 없는 현상이 발생한다. 결국, Course ID를 Null로 할 수 밖에 없는데, 기본키는 Null이 될 수 없으므로 테이블에 추가될 수 없다. 삽입하기 위해서는 '미수강'과 같은 Course ID를 만들어야 한다.

  • 문제: 불필요한 데이터를 추가해야 삽입할 수 있는 상황이 발생한다.
  • 예시:
  INSERT INTO StudentCourses (StudentID, CourseID, Department, Grade)
  VALUES (12345, NULL, '컴퓨터', NULL); -- 기본키가 NULL이 될 수 없어 삽입 불가
  • 해결 방법: 정규화를 통해 테이블을 분리하여 문제를 해결할 수 있다.

2. 갱신 이상(Update Anomaly)

어떤 학생의 전공(Department)이 "컴퓨터"에서 "음악"으로 바뀌는 경우, 모든 Department 값을 "음악"으로 바꾸어야 한다. 그러나 일부를 깜빡하고 바꾸지 못하는 경우, 데이터 불일치 문제가 발생한다.

  • 문제: 일부만 변경하여 데이터가 불일치하는 모순이 발생할 수 있다.

  • 예시:

UPDATE StudentCourses
SET Department = '음악'
WHERE StudentID = 12345; -- 일부 레코드가 업데이트되지 않을 수 있다
  • 해결 방법: 정규화를 통해 중복 데이터를 제거하고, 갱신 시 일관성을 유지할 수 있다.

3. 삭제 이상(Deletion Anomaly)

어떤 학생이 수강을 철회하는 경우, {Student ID, Course ID, Department, Grade}의 정보 중 Course ID를 삭제하면 Student ID, Department와 같은 학생에 대한 정보도 함께 삭제된다.

  • 문제: 튜플 삭제로 인해 꼭 필요한 데이터까지 함께 삭제되는 문제가 발생할 수 있다.

  • 예시:

DELETE FROM StudentCourses
WHERE CourseID = 'CS101'; -- 수강 정보 삭제 시 학생 정보도 함께 삭제
  • 해결 방법: 정규화를 통해 데이터베이스 구조를 개선하여 삭제 시 데이터 손실을 방지할 수 있다.

정규화를 통한 해결

정규화를 통해 테이블을 분리하여 데이터 중복을 제거하고, 이상 현상을 방지할 수 있다. 예를 들어, Student와 Course를 분리하여 두 개의 테이블로 만들 수 있다.

정규화된 테이블 예시

Student 테이블

CREATE TABLE Student (
    StudentID INT PRIMARY KEY,
    Name VARCHAR(50),
    Department VARCHAR(50)
);

Course 테이블

CREATE TABLE Course (
    CourseID VARCHAR(10) PRIMARY KEY,
    CourseName VARCHAR(50),
    Grade CHAR(1)
);

StudentCourse 테이블


CREATE TABLE StudentCourse (
    StudentID INT,
    CourseID VARCHAR(10),
    PRIMARY KEY (StudentID, CourseID),
    FOREIGN KEY (StudentID) REFERENCES Student(StudentID),
    FOREIGN KEY (CourseID) REFERENCES Course(CourseID)
);

데이터 삽입 예시


-- 데이터 삽입
INSERT INTO Student (StudentID, Name, Department) VALUES (12345, 'Alice', '컴퓨터');
INSERT INTO Course (CourseID, CourseName, Grade) VALUES ('CS101', '데이터베이스', 'A');
INSERT INTO StudentCourse (StudentID, CourseID) VALUES (12345, 'CS101');

So...

정규화는 잘못된 테이블 설계로 인해 발생하는 이상 현상(Insertion Anomaly, Update Anomaly, Deletion Anomaly)을 방지하기 위해 필요하다. 이를 통해 데이터의 무결성을 유지하고, 효율적인 데이터베이스 관리를 할 수 있다. 이상 현상을 방지하려면 데이터베이스 구조를 적절하게 설계하고, 정규화를 통해 데이터 중복을 최소화하는 것이 중요하다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글