1정규형(1NF)
첫 번째 정규형식(1정규형, 1NF)은 데이터베이스를 정규화 중 가장 간단한 형태입니다. 데이터베이스에서 테이블의 모든 로우의 컬럼 값은 나눌 수 없어야 합니다. 각 컬럼은 분할할 수 없는 원자 값만을 가져야합니다. 이 개념을 설명하기 위해 간단한예를 들어보겠습니다.
직원이라는 테이블이 있다고 가정해보겠습니다. 이 테이블에는 직원 이름과 직원 전화번호를 저장합니다. 직원은 하나 이상의 전화번호를 가질 수 있습니다. 이럴 경우, 직원 테이블에 직원 전화번호 컬럼 안에 전화번호 목록을 저장하는 방식은 1정규화에 부합하지 않습니다. 이를 해결하기 위해서는 직원 전화번호 테이블을 새로 만들고, 직원 테이블을 참조하여 데이터베이스를 설계할 수 있습니다.
이번에는 실제 표를 보면서 비슷한 예시를 들어보겠습니다.
id | 이름 | 게임 아이디 |
1 | 홍길동 | 홍길동1, 홍길동2, 홍길동3, 홍길동4 |
2 | 홍길순 | 홍길순짱짱걸, 나는야홍길순 |
위 테이블은 유저 테이블입니다. 개발자가 기획 문서에 회원은 여러 게임 아이디를 만들 수 있다는 요구사항을 반영해서 위와 같이 설계했다고 한다면, 이것은 잘 설계한 데이터베이스일까요? 1정규형을 기준으로 판단한다면 이것은 잘못 설계된 테이블입니다.
1정규형은 모든 로우의 컬럼 값은 나눌 수 없어야 한다고 했는데, 첫 번째 로우만 보더라도 게임 아이디는 홍길동1~4까지 총 4가지로 나눌 수 있기 때문입니다. 만약 데이터베이스에 홍길동3이 어떤 유저 아이디인지 조회한다면 복잡해질 수 있습니다.
이 데이터베이스를 설계한 개발자는 1정규형 기준을 나름 적용하여 아래와 같이 데이터베이스를 다시 설계했습니다.
id | 이름 | 게임 아이디1 | 게임 아이디2 | 게임 아이디3 | 게임 아이디4 |
1 | 홍길동 | 홍길동1 | 홍길동2 | 홍길동3 | 홍길동4 |
2 | 홍길순 | 홍길순짱짱걸 | 나는야홍길순 | null | null |
개발자는 위 테이블처럼 컬럼 수를 늘리는 방식으로 문제를 해결했습니다. 이것은 잘 설계한 데이터베이스인가요? 아닙니다. 첫 번째 값이 없음을 뜻하는 nul l값이 여기저기 생기게 됩니다. 두 번째, 홍길동이라는 유저가 아이디를 몇 개를 만들지 불명확하기 때문에 컬럼 수를 늘리는 방식으로는 문제를 해결할 수 없습니다. 이제 1정규형을 적용한 잘 설계된 데이터베이스 예시를 보여드리겠습니다.
1정규화가 적용된 경우,
id | 이름 |
1 | 홍길동 |
2 | 홍길순 |
일단 위처럼 유저 정보만을 저장하는 유저 테이블을 만듭니다.
id | 게임아이디 | 유저id |
1 | 홍길동1 | 1 |
2 | 홍길동2 | 1 |
3 | 홍길동3 | 1 |
4 | 홍길동4 | 1 |
5 | 홍길순짱짱걸 | 2 |
6 | 나는야홍길순 | 2 |
그리고 게임 아이디만을 저장하는 테이블을 생성하고 유저 id라는 FK(외래키) 컬럼을 추가해서 유저 테이블의 유저와 매칭 시켜줍니다.
정리하자면, 1정규형은 테이블의 모든 값들은 무조건 하나의 값만 가져야 한다를 의미합니다. 기준을 요약하면 아래와 같습니다.
- 테이블의 각 컬럼에는 더 작은 단위로 나눌 수 없는 원자 값만 포함되어야한다.
- 테이블의 모든 열은 반복되는 그룹이나 값 배열이 없어야한다.
다음 글에서는 2정규형에 대해서 알아보겠습니다.
댓글