0%

DB 정규화와 기본키 설정하기

데이터베이스의 정규화와 기본키에 대해서 살펴본 후 mariaDB에서 기본키 설정하는 방법을 설명합니다.


정규화 (Nomalization)

같은 자료를 받아도 설계자의 목표에 따라서 다른 테이블이 만들어 질 수 있다. 예를 들어, 식물에 관한 정보를 식물 관리인과 식물 연구자가 받았다고 가정해보자. 식물 관리인은 식물에게 물을 주는 주기나 식물의 생장 속도와 같은 정보들이 구체적으로 필요할 것이다. 반면 식물 연구자는 해당 식물의 세부적인 종이나 생물학적 특징 등이 필요할 것이다. 두 사람에게는 동일한 정보를 주어도 다른 테이블이 도출될 수 있는 것이다.

‘정규화’란 목표에 맞는 테이블을 올바르게 구성하는 것이다. 그렇다면 어떻게 정규화된 테이블을 만들 수 있을까? 정규화된 테이블은 아래의 두 가지의 원칙을 포함한다.

  • 테이블이 원자적 데이터로 구성되어 있다. (제 1정규형)
  • 기본키를 가지고 있다.

위 조건에서 ‘원자적 데이터’와 ‘기본키’는 낯선 용어이지만 관계형 데이터베이스에서는 중요한 개념이다. 따라서 두 개념을 간단하게 살펴본 후 정규화에 대해서 정리할 것이다.

원자적 데이터

원자적 데이터란 테이블에 사용되는 데이터가 더이상 쪼개질 수 없는 형태를 말한다. 그렇다면 더이상 쪼개질 수 없는 형태란 무엇인가? 이에 대해서는 절대적인 기준은 없으며, 테이블 생성 목적에 따라서 달라진다. 예를 들어 주소를 저장하는 테이블을 만든다고 가정해보자. 배달부에게 전달하기 위한 주소는 어차피 전체 주소를 전달해야 하기에 한 열에 저장해도 상관없다. 하지만 물류창고에서 지역별로 물건을 정리하는 경우에는 시군구를 따로 열로 지정하는 것이 원자적 데이터인 것이다. 즉, 목적에 따라서 원자적 데이터의 기준은 달라질 수 있다.

원자적 데이터 규칙은 다음과 같다.

  • 원자적 데이터로 구성된 열은 그 열에 같은 타입의 데이터 여러개를 가질 수 없다.
  • 원자적 데이터로 구성된 테이블은 같은 타입의 데이터를 여러 열에 가질 수 없다.
  • 단 테이블을 사용하는 목적에 따라 원자적 데이터 테이블의 형태가 달라질 수 있다.

PRIMARY KEY 기본키

기본키는 레코드의 고유번호를 지정해주며, 이는 데이터 중복 저장을 막아준다. 기본키는 주민등록번호와 같은 기존에 있는 카테고리를 기본키로 지정할 수 있으며, 또한 기본키만을 위한 열을 새로 만들 수도 있다. 새로 만드는 기본키의 경우 synthetic key라 하고, 이미 존재하는 열을 기본키로 사용할 경우 natural key라 한다.

기본키를 구성하는데 필요한 4가지 규칙이 있다.

  • 기본키는 NULL 값이 될 수 없다. NULL 값은 유일무이하지 않기 때문이다.
  • 기본키는 행이 삽입될 때 값이 있어야 한다.
  • 기본키는 간결해야한다. 유일무이한 정보를 가지고 있어야한다.
  • 기본키의 값은 변경 불가능한 값이여야 한다. 유일무이 하기에 변경 가능하면 중복이 생길 수도 있기에 변경 불가능 해야 한다.

기본키를 지정하는 방법은 테이블을 생성할 때 추가하는 방법이 있고, 기존에 있던 테이블에서 지정하는 방법이 있다.

테이블을 새로 생성할 때
아래와 같이 원하는 테이블의 코드를 입력한 후 기본키로 지정할 카테고리의 이름을 명령어 PRIMARY KEY을 사용하여 지정하면 된다.

1
CREATE TABLE '테이블 이름'( '카테고리 1' '특성' NOT NULL , '카테고리 2' '특성', PRIMARY KEY ('카테고리 1'));

위 코드는 ‘카테고리 1’을 기본키로 지정한 코드이다. 기본키로 지정된 열의 경우 중복된 데이터를 입력할 수 없다.

기존의 테이블에서 지정할 때
기존 존재하는 테이블에서 지정할 때는 명령어 ALTER을 사용하여 기본키를 설정한다.

1
ALTER TABLE '기존 테이블 이름' ADD PRIMARY KEY ('지정할 카테고리 이름');

위 코드는 기존에 있던 테이블의 카테고리를 기본키로 지정하는 코드이다. 참고로, 명령어 ALTER은 다음 글에서 자세하게 알아볼 것이다.

그렇다면 기존의 테이블에서 새로운 기본키 카테고리를 추가한 후 해당 카테고리를 기본키로 지정하려면 어떻게 해야할까?

1
2
3
ALTER TABLE '기존 테이블 이름'
ADD COLUMN '새로운 카테고리 이름' INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY ('새로운 카테고리 이름');

위 코드를 사용하면 된다. 그러면 기존 테이블에 새로운 카테고리를 추가하면서 기본키로 지정한다.

AUTO_INCREMENT

명령어 AUTO_INCREMENT 기본키가 정수일 때, 정수를 자동으로 지정해주는 방법이다. 이 명령어를 사용하면 기본키 입력에 있어서 매우매우 편하다. 기본키 위치에 NULL값을 입력하면 알아서 자동으로 고유값 정수를 제공하기 때문이다. 그렇다면 어떻게 사용하는가? 사용법은 간단하다.

1
CREATE TABLE '테이블 이름'( '카테고리 1' INT NOT NULL AUTO_INCREMENT, '카테고리 2' '특성', PRIMARY KEY ('카테고리 1'));

위 코드는 테이블을 생성할 때 지정하는 방법이다. 명령어 AUTO_INCREMENT는 기본키가 인수일 때 사용할 수 있기 때문에 해당 카테고리는 INT로 설정한다.

1
2
3
ALTER TABLE '기존 테이블 이름'
ADD COLUMN '새로운 카테고리 이름' INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY ('새로운 카테고리 이름');

기존 테이블에 추가할 때도 카테고리 추가하는 명령어에 같이 입력하여 사용하면 된다.