같은 사실을 여러 번 적을 때
동아리의 모든 행사 행에 동아리 연락처를 반복해서 넣으면 연락처가 바뀔 때 여러 행을 고쳐야 한다. 일부만 수정되면 같은 동아리에 서로 다른 연락처가 남는다. 행사와 동아리의 정보를 나누고 식별자로 연결하면 이 중복을 줄일 수 있다.
나누기만 하면 좋은 설계가 되는 것은 아니다. 어떤 항목이 무엇을 결정하는지 먼저 살펴야 한다. 동아리 번호로 동아리 이름과 현재 연락처가 결정된다면 이 관계가 구조를 정하는 근거가 된다.
키와 종속 관계
함수적 종속은 어떤 속성 집합의 값이 같으면 다른 속성의 값도 하나로 정해지는 관계를 뜻한다. 후보 키는 각 행을 구분할 수 있는 최소한의 속성 집합이다. 정규형은 이런 관계가 어떤 조건을 만족하는지 구분한다.
제1정규형, 제2정규형, 제3정규형과 보이스-코드 정규형 등이 알려져 있다. 단계가 올라갈수록 무조건 실무 성능이 좋아진다는 뜻은 아니다. 특히 복합 키의 일부에만 의존하는 값이나 키가 아닌 항목을 거쳐 결정되는 값을 구분하는 것이 기본적인 설계 검토에 도움이 된다.
분해 뒤에도 의미가 보존되어야 한다
테이블을 나눈 뒤 다시 연결했을 때 원래의 관계를 올바르게 복원할 수 있어야 한다. 잘못 분해하면 없던 조합이 생기거나 필요한 사실을 잃을 수 있다. 제약 조건을 어디에서 검사할 수 있는지도 함께 살펴야 한다.
겉보기의 중복이 같은 사실의 반복인지는 맥락에 달려 있다. 주문 당시의 배송지는 고객의 현재 주소와 다른 사실이다. 과거 배송지를 무조건 현재 주소로 연결하면 이력의 의미를 잃는다.
정규화와 조회 비용
구조를 나누면 조회에 조인이 필요할 수 있다. 반대로 중복을 줄여 변경을 단순하게 만들기도 한다. 실제 성능은 데이터 양, 인덱스, 조회 패턴과 실행 계획을 보고 판단해야 한다. 필요한 경우 비정규화를 선택할 수 있지만, 중복 값이 어긋나지 않게 유지할 책임도 함께 생긴다.
관련 문서
관계형 데이터베이스 / 데이터 모델 / SQL / 데이터베이스 트랜잭션