2월 08, 2022

관계형 데이터베이스

 관계형 DB는 데이터 사이의 관계에 기초를 둔 Database 시스템입니다

관계형 DB에서 모든 데이터는 2차원 테이블로 표현할 수 있습니다.

테이블의 가장 첫 컬럼은 언제나 id입니다. ( 각 row의 primary key - 고유키)

이 primary key를 사용하여 특정 로우를 찾거나, 인용(reference)할 수 있습니다.

DB에서 column(열)은 필드라고 부르며, 항목의 속성을 나타냅니다. 필드마다 데이터의 유형을 정할 수 있습니다

row(행)은 레코드라고도 부르며, 각 데이터 항목을 저장합니다

Schema(스키마)는 필드에 저장되는 데이터에 대한 제약사항 입니다. 예를 들면, 반드시 값을 가져야 한다(not null) 등이 있습니다. 


테이블 사이 관계의 종류.



관계형 데이터베이스의 예시입니다. 

고객 정보 테이블(customer_information)에는 고유 ID와 고객에 대한 정보(name, request_information, phone_number), 그리고 fk로 쓰이는 order_id가 저장돼 있습니다. 고객 주문(customer_order)테이블에는 주문한 제품의 정보가 저장됩니다. 그러나 해당 테이블에는 고객의 name, 연락처(phone_number)등은 저장돼 있지 않습니다. 

이 두 테이블에서 공통된 것은 ID열(customer_order의 pk) 단 하나입니다. 이 공통된 ID열 덕분에 관계형 DB는 두 테이블 간의 관계를 생성할 수 있습니다. 

주문처리 시스템에 의해 데이터베이스에 주문이 제출되면, 데이터베이스는 customer_order 테이블로 이동하여 고객의 제품 주문에 대한 올바른 정보를 가져옵니다. 그리고 해당 테이블의id를 정참조하는 customer_information테이블을 사용하여 고객 정보(customer_information) 테이블에서 고객의 청구 및 배송 정보등을 조회할 수 있습니다. 

이렇듯 테이블을 분리해놓지 않는다면, 중복되는 값이 발생하기에 수정에 있어서 어려움을 겪을 것입니다. 

따라서 테이블을 분리시킨 후, primary key(기본키)와 foreign key(외래키) 를 사용하여 관계를 맺어줍니다. 위의 예제의 경우 customer_order의 id는 pk입니다. 이 id필드는 각 row(레코드)가 중복된 값을 가질 수 없습니다. 

customer_information의 의 order_id는 customer_order의 pk를 참조하는 외래키입니다. 이 필드는 각 테이블의 레코드를 연결시켜주는 역할을 합니다. 

이렇게 테이블을 분리하고, 중복 데이터를 제거하는 과정을 "정규화"라고 합니다.

정규화에는 제 5 정규화까지가 존재합니다. 제3정규화까지 잘 충족한다면 나머지 4,5 정규형도 만족하는 경우가 많기에 제 3정규화까지 정리해보겠습니다.

굳이 한 테이블에 있지 않아도 되는 속성들은 다른테이블로 빼주고, 이를 pk와 fk로 연결하는 과정이 정규화입니다.

제 1 정규형 

도메인 원자값 이란 조건을 만족해야 제1 정규형을 갖출 수 있습니다.

도메인 원자값을 만족시키려면 어떻게 해야할까요?

a. 반복 그룹이 존재하면 안됩니다.

b. 모든 행은 식별자(키)로 완전하게 구분돼야 합니다.

- 이 경우, 분리해놓은 테이블은 pk만으로 모든 행이 구분되지 않기에, 추가적으로 key를 설정해주어야 합니다.

예제에서는, 반복 그룹이 존재하지 않도록 고객 정보와, 주문 정보를 식별자로 분리놓았습니다.


제 2 정규형

키가 아닌 값들은 모두 키에 종속돼야 합니다.

1. key가 아닌 column(속성)은 key컬럼에 종속돼야 한다

2. 그래서 "복합키"의 경우에만 제 2 정규형의 조건이 됩니다

위의 예제의 경우, 복합키가 존재하지 않으며, 모든 값은 각 테이블의 pk에 종속됩니다

 

제 3 정규형 

필요총분조건: 제 2정규형을 만족하고, 테이블 내의 모든 속성이 키에만 의존하며 다른 후보키에 의존하지 않는다.

1. 모든 키가 아닌 컬럼(non-key)는 key컬럼에 완전히 종속돼야 합니다

2. 모든 non-key컬럼은 key컬럼에만 종속돼야 한다

예를들어, non-key컬럼에 '이공대학' 과 '전공'이 있게된다면, nonkey임에도 불구하고 '전공'은 '이공대학'에 종속되게 됩니다. 이러한 경우 nonkey간의 종속관계를 정리해줘야 합니다.

위의 예제의 경우 non-key간의 종속관계가 발견되지 않습니다.