[데이터 모델과 SQL] 1. 데이터베이스
기능이 단순하고 크기가 작은 서비스 조차 서비스에 사용되는 데이터는 데이터베이스를 이용해서 관리해야 한다. 프로그래밍을 해 보면 알겠지만 데이터베이스 없이 데이터를 저장, 수정, 검색하는 것은 힘든 일이고, 또 여러 오류에도 취약하게 된다.
데이터베이스 중 가장 기본이 되는 것이 RDB, 즉 관계형 데이터베이스(Relational DataBase)다. 흔히 RDBMS라는 용어도 많이 사용하는데 RDBMS는 RDB를 관리하는 관리 시스템(RDB Management System)의 줄임말이다. 예를 들어 MySQL, MariaDB 등이 대표적인 RDBMS들이다.
RDB에서 'Relational'은 무엇을 뜻할까? 나도 처음에는 RDB가 하나 이상의 테이블들로 구성되고 데이터의 여러 측면들은 이들 테이블 사이의 관계에서 오니까(예, 고객 테이블 + 음식 테이블 = 주문 정보) 테이블 사이의 '관계'가 맞겠지 생각했었다. 하지만 RDB에서 Relation의 정확한 유래는 집합 이론(Set theory)의 하위 분야인 관계 이론(relation)에서 온 것이다.
참고로 RDB는 1960~70년대에 에드가 프랭크 코드(Edgar Frank Codd)에 의해 연구되었고 그가 데이터를 관리하기 위해 도입한 이론이 집합 이론, 그 중에서도 관계 이론이었다(출처: John L. Viecas, 『SQL Queries for Mere Mortals』 4th Ed., Addison Wesley, 2018. pp.16-17). |
하지만 데이터의 여러 측면이 테이블 사이의 관계로 정의되는 것도 맞기 때문에 relation을 '테이블 사이의 관계'라고 보아도 의미는 관점에서는 맞는 셈이다.
RDB는 테이블(table)들로 구성된다. 그리고 테이블은 다시 행(record, tuple, row라고 표현한다)과 열(attribute, field, column이라고 표현한다)로 구성된다.
열 or attribute or field or column | |
행 or record or tuple or row→ | ↓ |
테이블 사이에는 아래 세 가지 중 하나의 관계가 성립한다.
구분 | 설명 | 예 |
1:1(one to one) | 두 테이블의 행(row)이 1:1로 대응되는 경우 | 직원 테이블 - 급여 테이블 |
1:다(one to many) | 주(primary) 테이블의 하나의 row가 부(secondary) 테이블의 여러 row에 대응되는 경우 | 고객 테이블(주) - 예약 내역 테이블(부) |
다:다(many to many) | 두 테이블에서 각 테이블의 하나의 행이 다른 테이블의 여러 행에 대응되는 경우 | 고객 테이블 - 음식 테이블 |
세 관계 중 가장 복잡한 것이 다:다 관계인데 두 테이블이 이런 경우에 있는 경우 연결 테이블(linking table)을 생성해서 두 테이블을 연결하는 것이 일반적이다. 예를 들면 고객 테이블과 음식 테이블을 주문 테이블을 연결 테이블로 연결할 수 있다. 아래는 주문 테이블의 예다.
주문 ID | 고객 ID | 음식 ID |
0 | customer_1 | dish_4 |
1 | customer_5 | dish_8 |
2 | customer_2 | dish_1 |
어떤 테이블이 다른 테이블의 제일 키(primary key)를 데이터로 가지고 있으면 이를 외부 키(foreign key)라고 한다. 위의 주문 테이블 예에서 고객 ID와 음식 ID는 각각 고객 테이블과 음식 테이블의 제일 키이고 주문 테이블 입장에서는 외부 키가 된다.
가장 기본이 되는 데이터베이스인 RDB에서 RDB는 테이블을 기본 요소로 갖지만 테이블에서 일정 조건을 만족시키는 데이터만을 추출하거나 일부 열 만을 추출해 볼 수도 있다. 이와 같이 테이블로 부터 얻어진 데이터를 '얻어진 테이블(derived table)' 혹은 '가상 테이블(virtual or logical table)'이라고 한다.
가상 테이블은 요청식(쿼리, query)을 통해 생성되고 실제 데이터는 기본 테이블(base table)에 저장되어 있다. 가상 테이블의 예를 앞으로 SQL을 살펴보면서 많이 접할 수 있을 것이다.
참고로 데이터 수집 시점을 기준으로 데이터 베이스를 두 가지로 구분해 볼 수도 있다.
· Operational DB: 동적 데이터베이스다. 실시간 혹은 필요할 때 마다 정해진 항목을 기록하는 DB. 언제 어떤 데이터가 들어올지 예상하기 힘들다. 예로서 쇼핑몰에서 상품 구매 정보, 병원의 진료 정보, 도서관의 대출 정보들을 들 수 있다.
· Analytical DB: 정적인 데이터베이스다. 특정 시점마다 정해진 데이터를 수집하고 저장한다. 예를 들면 일자 별 환율, 시간 별 통행 차량 수 등이다.
■