[DB설계] 21. 테이블 구조 - 열x행

표준 SQL 및 데이터베이스 입문

by AI개발자
gaebalai-sql-db (1).jpg

우선 제1정규형입니다. 지금까지 테이블을 2차원 표로 보았지만, 이제 값을 조합한 집합으로 생각해 봅시다. 예를 들어, 조합을 괄호로 나타내면 (001, 이순신), (002, 안창호), (003, 노무현)와 같이 동일한 관계를 갖는 값들의 집합이 테이블입니다. 괄호안에는 ID와 이름의 조합이 들어있습니다. 3개의 데이터 조합을 표 형태로 표현하면 ID열과 이름열로 나타낼 수 있을 것 같습니다. 이것이 '테이블은 2차원 표 형태로 표현할 수 있다'는 말은 바로 그런 의미입니다. 그리고 테이블에는 그 이상의 구조를 부여할 수 없습니다.


테이블에 데이터를 저장할 수 있는 형태가 바로 제1정구형입니다. 즉, 데이터를 테이블에 저장할 수 있는 형태가 제1정규형이며, 비정규형 데이터를 정규화하기 위해서는 각 열에 동일한 데이터형의 값이 단 하나만 들어가도록 해야 합니다.


각 열의 데이터형식을 단순화하여 제1정규형으로 만들기

sql041.png


⑴ 도출항목 제거

제1정규형에서는 도출항목(derived attribute)도 제거합니다. 도출항목이란 다른 값들로부터 산출되는 값을 말하는데, 예를 들어, 단가와 갯수로 금액이 계산된다면, 금액은 테이블에 저장해서는 안됩니다. 계산은 SELECT문을 사용하면 되니까...


하지만, 왜 안되는 것일까요? 필요없다는 것은 알겠지만 안된다고 하는 것일까요?

편리해보이는 항목을 만들고 싶어지지만, 예를 들어 단가, 갯수, 그리고 금액이 모두 저장된 테이블이 있다고 가정하면 단가만 수정하게 되면 금액과 모순이 생길 수 있습니다. 도출항목의 제거란 단순히 '실수하지 않도록 주의하라'는 것이 아니라, '데이터 구조상에서 단가와 갯수만 저장해 두라'는 의미입니다.


다른 값들로부터 산출가능한 값을 도출항목 또는 도출속성이라고 합니다. 예를 들어, 단가와 갯수로 금액이 산출되는 경우, 금액이 도출항목이 됩니다. 제1정규형에서는 이러한 도출항목을 제거합니다. 도출항목은 SELECT문으로 생성할 수 있으므로, 자주 사용하는 항목이라면 뷰(View)로 정의하는 것이 좋습니다.



⑵ 반복항목 제거

겉보이게는 열x행의 표형태로 보이더라도, 그 안에 또 다른 구조가 숨어 있을 수 있습니다. 이를 반복항목(repeating group)이라고 합니다. 예로 전화번호를 설명했을 때 나왔던 내용으로 목록에 전화번호 칸이 3개있거나, 1주일치 데이터가 가로로 나열되어 있을 때, 전화번호나 요일별 데이터처럼 반복되는 항목을 반복항목이라고 부릅니다.


관계형 데이터베이스에서는 이러한 반복항목을 갖지 않도록 해야 합니다. 가로로 나열된 열에 반복항목이 있더라도 '2차원 표'라는 형태는 유지되지만, 반복항목은 구조변경에 내성이 없다는 문제가 있습니다. 예를 들어, 전화번호를 3개의 열로 관리할 경우, 4번째 전화번호를 가진 사람을 관리할 수 없게 됩니다. 반대로 전화번호가 1개밖에 없는 사람의 경우에는 전화번호2, 전화번호3 열에 NULL값이 들어갑니다.


반복항목의 예제

sql042.png

한눈에 보면 틀(프레임)이 변하지 않을 것처럼 보이는 달력 데이터에서도 같은 현상이 발생합니다. 예를 들어, 1월, 2월 ~ 12월이라는 열을 마련해 두었을 경우, '4월부터 내년 3월까지의 집계'를 하는 것은 어렵습니다. 즉, 1월부터 12월이라는 틀이외의 처리가 불가능해져 매우 번거로운 상태가 되는 것입니다.


반복항목이 있으면 제1정규형이 되지 않음

sql043.png

독서, 스포츠관람을 별도의 테이블로 분리하는 부분은 아직 완전히 이해하지 못할 수 있습니다. 이유도 설명되었고, SELECT문으로 어떻게든 처리할 수 있다는 것도 배웠지만 '반복항목'에 대한 고민은 끝이 없습니다. 특히, 항목 갯수가 정해져 있는 경우에는 고민할 일이 많습니다. 바로 그점인데 예를 들어 설문지처럼 선택지에서 선택하는 경우라면 항목의 수는 정해져 있으니 가로로 나열하면 되겠다고 생각하게 도비니다.


하지만, 그렇게 하면 테이블을 그대로 표히라 때는 편해지더라도, 필터링하거나 집계할 때의 처리를 복잡해지게 됩니다. 그래서 가로로 나열하는 것은 뷰의 역할로 두는 것이 결국은 간단하고 안전합니다.



©2024-2025 GAEBAL AI, Hand-crafted & made with Damon Jaewoo Kim.

GAEBAL AI 개발사: https://gaebalai.com

AI 강의 및 개발, 컨설팅 문의: https://talk.naver.com/ct/w5umt5


keyword
이전 20화[DB설계] 20. 정규화의 목적