개발자

제 3정규화 관련 질문있습니다.

2023년 12월 11일조회 55

만약 member 테이블에 email (unique) nickname (unique) introduction 이렇게 3개의 컬럼이 있을 경우 email -> nickname, nickname -> introduction, email -> introduction 이므로 3정규화를 진행하게 되면 member(테이블) email nickname member_introduction(테이블) nickname introduction 이렇게 둘로 나뉘는게 맞나요? 결국 한 테이블에 unique 제약조건이 있는 컬럼이 2개 이상일 경우 3정규화를 필수로 진행해야 한다는 얘기 같은데 제가 제대로 이해한건지 궁금합니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

인기 답변

장성호님의 프로필 사진

email -> nickname / nickname -> introduction 이므로 email -> introduction라고 말씀대로 가정해보겠습니다. 이러면 이행 함수 종속 관계가 있기에, 질문자님의 방법대로 정규화를 진행하면 됩니다. 다만 unique 제약조건이 있는 컬럼 2개 이상 있을 경우, 3정규화를 필수로 진행해야한다는 이야기는 아닙니다. 왜냐면 3정규화는 테이블 속성간 종속 관계를 중점으로 보기 때문입니다. 3정규화 규칙은 테이블 내 모든 속성이 기본키에 의존하고, 다른 후보 키에 의존하지 않는 것입니다. 질문자님의 예시에서 introduction이 무엇을 뜻하는지 모르겠어서, 생일(birthday)을 기준으로 해보겠습니다. A 닉네임 - 1900.11.11 - a@google.com B 닉네임 - 1900.11.11 - b@google.com 이러한 데이터가 있을 때 질문 내용에서는 현재 기본키가 주어지지 않아, 다음 시나리오를 검토해보겠습니다. 1. 중복되지 않은 닉네임을 고른다. 2. 이메일을 입력한다. 이메일은 중복될 수 없다. 3. 사용자가 생일을 선택한다. 생일은 중복 가능하다. 4. DB 저장은 닉네임을 PK로 한다. 이럴 경우에는 닉네임 -> 이메일, 닉네임 -> 생일 이라는 관계만이 존재합니다. 어떤 이유로 이메일을 변경한다고 하더라도, unique만 만족하면 생일은 바뀔 이유가 없습니다. 만약 3NF를 만족시키지 못하려면 시나리오가 이래야 됩니다. 1. 중복되지 않은 닉네임을 고른다. 2. 이메일을 입력한다. 이메일은 중복될 수 없다. 3. 이메일에 연동되어 있는 생일 정보를 가져온다. 4. DB 저장은 닉네임을 PK로 한다. 이러면 이메일을 변경했을 때 생일이 같이 변경될 수 있는 종속 관계가 생깁니다. 이때는 닉네임 -> 이메일 -> 생일 이라는 이행 함수 종속이 있으므로, 3NF를 만족하지 못 합니다.

salbyul님의 프로필 사진

salbyul

작성자

공부중2023년 12월 11일

완벽하게 이해했어요! 정말 감사합니다 ㅎㅎ

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2023년 12월 11일

정규화의 목적은 데이터베이스에서 데이터 중복을 없애고, 결함을 방지하여 데이터 무결성을 유지하는 것입니다. 제 3정규화의 경우, 특정 속성이 기타 속성에 의존하지 않아야하며(non-transitively dependent), 이것은 함수적 종속성 개념으로 이해할 수 있습니다. 데이터베이스 설계에서 제 3정규화를 적용하기 전에 제 1정규화(각 행이 유일한 키로 식별 가능)와 제 2정규화(각 테이블에서 모든 컬럼이 해당 테이블의 기본키에 완전히 종속)를 우선 시행해야 합니다. 제시해준 예시의 경우 member 테이블에서 email과 nickname은 고유(unique)하므로, 이 두 속성 모두 각각의 기본키가 될 수 있습니다. 따라서 introduction은 email, nickname 양쪽 에서 종속됩니다. 그러나, 정규화를 진행하는 주요한 사유는 데이터 중복을 없애기 위함입니다. 만약 introduction 컬럼이 nickname에만 종속되어있다면 분리하는 것이 맞습니다. 하지만 여기서는 introduction 값 변경시 email과 nickname 둘 다 변경되어야 합니다. 따라서 이런 경우에는 두 테이블로 나눌 필요가 없습니다. 그러나 만약 introduction이 nickname에만 종속적이며, email이 변경될 가능성이 있다면 제안한 대로 두 개의 테이블로 분리하는 것이 좋습니다. 간단히 말해서, 3정규화를 할지 안 할지는 여러가지 요인을 고려해야하며, 항상 데이터 중복을 최소화하고 데이터 무결성을 유지하는 것이 목적입니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!