Cộng đồng Hỏi & Đáp của Inflearn
BCNF 질문
Viết
·
32
0
마지막에 professor_name을 pk로 두고 그에 따라 1:1이기때문에 과목명을 그냥 컬럼으로 두셨는데 그러면 그 과목명이 만약에 바뀐다면 (데이터베이스 -> DB) 그렇다면 데이터베이스 수업을 하는 모든 교수님의 컬럼을 바꾸어야하니 갱신이상이 일어나는것 아닌가요?
이런 경우는 어떤 정규형을 위반한건지 궁금합니다.
Quiz
Mục đích chính của chuẩn hóa cơ sở dữ liệu là gì?
Cải thiện tốc độ tìm kiếm dữ liệu
Giảm thiểu trùng lặp dữ liệu và duy trì tính nhất quán
Tăng cường mức độ mã hóa dữ liệu
Mở rộng không gian lưu trữ vật lý
Câu trả lời 2
0
안녕하세요. escho94님 🙂
결론부터 말씀드리면, 이 구조는 제1정규형부터 BCNF까지 어떠한 정규형도 위반하지 않은 상태입니다.
이유는 다음과 같습니다.
데이터베이스의 정규화(1NF ~ BCNF)는 기본적으로 테이블 내 컬럼 간의 함수 종속성(Functional Dependency)을 분석하여 이상 현상을 제거하는 과정입니다.
professor_bcnf 테이블은 기본 키(PK)인 professor_name을 알면 lecture_name을 알 수 있는 구조입니다.
여기에는 부분 함수 종속(2NF 위반)이나 이행적 함수 종속(3NF 위반)이 없으며, 기본 키가 아닌 일반 컬럼이 다른 컬럼을 결정하는 BCNF 위반 요소도 존재하지 않으므로 정규형을 완벽하게 만족합니다.
그렇다면 말씀하신 갱신 이상과 같은 문제는 왜 발생하는 것일까요?
이는 정규화 이론의 위반 때문이 아니라, 자연 키(Natural Key) 성격을 가진 문자열 데이터를 직접 사용했기 때문에 발생하는 한계입니다.
해당 BCNF 예제는 정규화의 원리(결정자와 종속자의 관계) 자체를 가장 직관적으로 설명하기 위해 '과목명'이라는 비즈니스 의미를 가진 데이터를 그대로 사용한 학술적인 예시입니다.
만약 실무에서 이와 같이 설계한다면, 비즈니스 요건(과목명 변경)이 바뀔 때 관련된 모든 레코드를 찾아서 연쇄적으로 업데이트해야 하는 심각한 문제가 발생하게 됩니다.
이를 현대적인 데이터베이스 설계 방식으로 완벽하게 해결하려면, 강의에서 설명드린 것 처럼 대리 키(Surrogate Key)를 도입하여 테이블을 한 번 더 분리해야 합니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. escho94님.
질문해주신 내용은 데이터베이스 정규화, 특히 BCNF(보이스-코드 정규형)과 관련된 것입니다. 현재 상황에서 갱신 이상이 발생할 수 있는 이유와 어떤 정규형을 위반했는지 살펴보겠습니다.
갱신 이상 및 정규화 문제
갱신 이상(update anomaly): 말씀하신 대로, 특정 컬럼(과목명)이 변경될 때 여러 레코드의 값이 함께 변경되어야 하는 경우가 발생합니다. 이는 데이터 무결성을 유지하기 어려운 상황을 초래합니다. 이러한 상황은 일반적으로 테이블에 중복된 정보가 존재할 때 발생합니다.
BCNF 위반 가능성: BCNF 정규형은 모든 결정자(결정하는 속성)들은 후보 키에 속해야 한다는 규칙을 따릅니다. professor_name을 기본키로 사용하고, subject_name이 바뀔 때 모든 관련 레코드가 함께 바뀌어야 한다면, 이는 비결정적인 속성이 후보 키가 아닌 다른 속성에 의존한다는 것을 의미할 수 있습니다. 즉, subject_name이 professor_name에 종속적이지 않으며, 이로 인해 BCNF를 위반하게 됩니다.
해결책
이러한 문제를 방지하기 위해서는 과목명을 별도의 테이블로 분리하여 과목 ID와 이름을 매칭시키고, 교수 테이블에서는 과목 ID만을 참조할 수 있도록 설계합니다. 이렇게 하면 과목명이 바뀔 때 과목 테이블의 한 레코드만 수정하면 되므로 갱신 이상의 문제가 해결됩니다.
관련 참고 링크
위의 내용을 바탕으로, 데이터베이스 정규화를 통해 갱신 이상을 피하고 BCNF 규칙을 유지하실 수 있기를 바랍니다. 추가적으로 더 궁금한 점이 있으시면 언제든지 질문해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




