콘텐츠로 건너뛰기

데이터베이스 뽀개기 (4) 논리적 데이터 모델링, 관계형 모델

지난 글에서는 ERD로 대략적인 데이터의 청사진을 그려보았다. 이제 DBMS 상에서 데이터를 어떻게 담을 것인지 그 그릇을 만들 차례다. 데이터 모델링의 세 번째 단계인 논리적 데이터 모델링 작업은 관계형 모델을 만들면서 시작한다.

■ 릴레이션(Relation)

우리가 보통 데이터를 다룬다고 할 때 떠오르는 장면은? #엑셀 #테이블

릴레이션은 데이터베이스 용어로, 데이터가 저장된 2차원의 테이블을 말한다. 일상적으로 우리가 쓰는 형식과 매우 유사한데 몇 가지 명칭이 다르니 살펴보고 가자.

1. 컬럼(Column)
우리가 흔히 ‘열’이라고 부르는 것을 데이터베이스에서는 컬럼(또는 필드나 속성)이라고 한다.

2. 레코드(Record)
흔히 ‘행’이라고 부르는 것을 데이터베이스에서는 레코드(또는 튜플)이라고 한다.

3. 인스턴스(Instance)
릴레이션에 저장된 실제 데이터값들을 인스턴스라고 한다.

4. 스키마(Schema)
각 열을 대표하는 속성인 ‘헤더’를 스키마라고 한다.

■ 릴레이션의 특징

1. 컬럼의 원자성
컬럼은 서로 다른 이름을 가져야만 한다. 또한, 각 컬럼값은 도메인에 정의된 값만을 갖고, 그 값은 모두 단일값이어야한다. 즉, 이름 컬럼 내에 윤필중, 김민중과 같이 복수 값을 넣으면 안된다.

2. 컬럼의 무순서성
컬럼의 순서에는 특별한 의미가 없다.

3. 레코드의 유일성
릴레이션 내에서 레코드는 중복되면 안된다. 즉, 고객 ID: 2 / 이름: 정금자 / 전화번호: 010-2222-2222 / 주소: 광주광역시 북구 를 가진 행이 2개 이상 존재하면 안된다.

4. 레코드의 무순서성
레코드의 순서에는 특별한 의미가 없다.

■ 키(Key)

키는 릴레이션의 레코드를 식별할 수 있는 유일한 값을 말한다. 유일성(uniqueness), 최소성(irreducibility)에 따라 키는 4가지 종류로 나뉜다.

1. 슈퍼 키(Super Key)
유일성을 만족하는 키다. 즉, 하나의 키값으로 특정 행을 바로 찾아낼 수 있는 속성이다. 고객 ID와 같은 속성이 될 수 있고, 이름+주소 와 같이 2개의 속성을 결합하여 유일한 키로 만들 수도 있다.

2. 후보 키(Candidate Key)
유일성과 최소성을 모두 만족하는 키다. 최소성이란 말그대로 속성을 최소한으로 갖는다는 것을 의미한다. 이름+주소와 같이 2개 속성을 결합한 경우와 고객 ID와 같이 1개 속성을 가진 것을 비교했을 때 고객 ID는 유일성과 최소성을 모두 만족하게 된다.

3. 기본 키(Primary Key, PK)
후보 키 중에서 1개를 선택하는 기본 키는 가장 중요한 키다. 레코드를 구분하기 위해 릴레이션 내에서 1개만 지정할 수 있다. 레코드를 구분해야하기 때문에 당연히 NULL 값과 중복 값은 허용하지 않는다. (NULL은 입력된 적이 없거나 적용 불가능한 값을 말한다. ‘0’ / ‘n/a’ 값이 아님을 주의하자.)

4. 대체 키(Alternate Key)
만약 후보 키가 2개 이상이라면, 기본 키로 선택되지 않은 나머지 후보 키를 대체 키라고 부른다.

5. 외래 키(Foreign Key, FK)
참조된 다른 릴레이션의 기본 키를 말한다. 데이터를 보다 쉽게 조회하기 위해서 릴레이션 간에 관계를 연결할 일이 생긴다. 이 때, 외래 키는 다른 릴레이션의 데이터를 참조할 때 이상한 값(존재하지 않는 값)을 참조할 수 없도록 일종의 제약을 주는 셈이다.

'참조'를 통해 레코드 간의 연결이 가능함을 보여주는 이미지입니다. 고객 릴레이션과 주문 릴레이션을 연결할 때 고객 릴레이션의 기본 키인 고객 ID를 외래키(주문고객)로 삼아 연결되었습니다.

고객 정보와 주문 정보를 연결시켜보자. 만약 고객 릴레이션의 기본키인 고객 ID를 외래키로 가져온다면, 우리는 고객 릴레이션과 주문 릴레이션의 정보를 매칭시킬 수 있다.

외래키의 모든 필드는 참조하는 기본키와 동일한 값의 종류와 범위를 가지며, 기본키와 동일하거나 null 값을 가진다.

개념을 파악했으니, ER 다이어그램을 관계형 모델로 변환하는 과정은 다음의 블로그를 참조하길 바란다. 스텝만 따라가면 그리 어렵지 않다. 다음 글부터는 본격적으로 SQL을 다뤄볼까 한다.