# 02강. 다양한 데이터베이스
- `DBMS`에는 여러 종류가 있다. 데이터베이스의 사용  용도나 이를 제어하는 프로그래밍 환경 등 각각의 조건에 들어맞는 다양한 `DBMS`가 고안되었기 때문이다.
- 데이터베이스 중에서도 `SQL`로 데이터를 다루는 데이터베이스를 `관계형 데이터베이스(RDB: Relational Database)`라고 한다.

---

## 1. 데이터베이스 종류
- `DBMS`는 데이터 저장 방법에 따라 몇 가지로 분류할 수 있다.

### 계층형 데이터베이스
- 폴더와 파일 등의 계층 구조로 데이터를 저장하는 방식의 데이터베이스이다.
- 하드디스크나 DVD 파일시스템을 이러한 계층형 데이터베이스라고 할 수 있다.
- 하지만 현재 `DBMS`로 채택되는 경우는 많지 않다.

### 관계형 데이터베이스
- `관계 대수(relational algebra)`라는 것에 착안하여 고안한 데이터베이스이다.
- 쉽게 말하면 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 데이터베이스를 가리킨다.
- 다만, 엄밀히 말해 관계 대수는 표 형식 데이터와는 아무런 관계가 없다.
- 표형식 데이터란 2차원 데이터를 말한다.
- 가로 방향으로는 `열`을, 세로 방향으로는 `행`을 나열한다.
- 관계형 데이터베이스에는 이러한 표를 잔뜩 저장해두고, 각각의 표에 이름을 붙여 관리한다. 이때 데이터베이스 안의 데이터는 `SQL` 명령어로 조작할 수 있다.

### 객체지향 데이터베이스
- `자바`나 `C++`를 객체지향 언어라고 하는데, `객체(object)`라는 것을 중심으로 프로그래밍하는 언어이다.
- 여기서 `가능하면 객체 그대로를 데이터베이스의 데이터로 저장하는 것`이 객체지향 데이터베이스이다.

### XML 데이터베이스
- `XML`이란 자료 형식을 가리키는 용어로, 태그를 이용해 마크업 문서를 작성할 수 있게 정의한 것이다.
태그는 `<data>데이터</data>`와 같은 형식으로 표현한다.
- `XML` 데이터베이스는 이처럼 `XML` 형식으로 기록된 데이터를 저장하는 데이터베이스이다.
- `XML` 데이터베이스에서는 `SQL` 명령을 사용할 수 없다. 대신 `XML` 데이터를 검색할 때는 `XQuery`라는 전용 명령어를 사용한다.

### 키-밸류 스토어(KVS)
- 키와 그에 대응하는 값(밸류)이라는 단순한 형태의 데이터를 저장하는 데이터베이스이다.
- 키와 밸류의 조합은 `연상배열`이나 해시 테이블(hash table)에서 자주 볼 수 있다.
- `NoSQL(Not only SQL)`이라는 슬로건으로부터 생겨난 데이터베이스로, 열 지향 데이터베이스라고도 불린다.

```
연상배열(associative array): 자료구조의 하나로, 키 하나와 값 하나가 연관되어 있으며 
키를 통해 연관되는 값을 얻을 수 있다. 연상 배열, 결합성 배열, 맵(map), 딕셔너리(dictionary)로 부르기도 한다.
```

---

## 2. RDBMS 사용 시스템
- `RDBMS`는 역사가 깊은 만큼 다양한 시스템에서 사용된다.
- `메인프레임(main frame)`은 대부분 `RDBMS`를 사용한다고 봐도 무방하다.
- 다만, 최근에는 메인프레임 자체를 찾아보기가 어려워졌다. 다운사이징으로 인해 `소형 워크스테이션(workstation)`으로 대체되었기 때문이다.
- 그래도 여전히 데이터베이스 서버로는 `RDBMS`가 사용되었는데, 이때부터 클라이언트/서버 구조도 유행했다.

---

## 3. 데이터베이스 제품
- `RDBMS`는 관계형 데이터베이스를 관리하는 소프트웨어를 일컫는 말이다. 다만 `RDBMS`라는 이름의 소프트웨어가 존재한다는 뜻은 아니다.

### Oracle
- `Oracle` 데이터베이스는 오라클에서 개발한 `RDBMS`이다.
- 현재 가장 많이 쓰이는 `RDBMS` 중 하나로, 사실상 `RDBMS`의 표준이라고 해도 문제없을 정도로 유명하다.

### DB2
- `IBM`이 개발한 `DB2`는 `Oracle`처럼 역사가 오래된 `RDBMS`이다.
- 다만 오라클이 유닉스 워크스테이션 중심이었던 것과 달리, `DB2`는 발표된 이래 한동안 `IBM` 컴퓨터에서만 구동되었다.
- 이후 유닉스나 윈도우 등의 플랫폼에서도 `DB2`를 구동할 수 있게 되었다.

### SQL Server
- `SQL Server`는 윈도우를 개발한 마이크로소프트가 개발한 `RDBMS`로, 윈도우 플랫폼에서만 동작한다.

### PostgreSQL
- `PostgreSQL`은 오픈소스 커뮤니티가 개발한 `RDBMS`이다. 무료 소프트웨어인 만큼 자유롭게 사용이 가능하다.
- 기반이 되는 `RDBMS`는 캘리포니아 대학교 버클리 캠퍼스에서 탄생했는데, 그 때문인지는 몰라도 실험적인 기능이 포함되어 있거나 독특한 구로를 가지기도 한다.

### MySQL
- `MySQL`은 `PostgreSQL`과 마찬가지로 오픈소스 커뮤니티에서 태어난 `RDBMS`이다.
- 경량 데이터베이스라는 점을 강조하여, 필요한 최소한의 기능만을 갖추고 있다.
- 하지만 기능이 확장되면서 지금은 다른 `RDBMS`와 비교해도 부족하지 않을 정도이다.

### SQLite
- 오픈소스 커뮤니티에서 태어난 `SQLite`는 임베디드 시스템에 자주 쓰이는 작은 `RDBMS`이다.

---

## 4. SQL의 방언과 표준화
- `RDBMS`는 처음부터 `SQL` 명령어를 이용해 데이터베이스를 조작하도록 설계된만큼, `SQL`을 사용할 수 없는 `RDBMS`는 없다.
- 하지만 각 데이터베이스 제품 별로 기능 확장이 이루어지는 과정에서 `비슷한 조작을 실행하더라도 서로 다른 명령어가 필요한` 상황이 발생했다.
- 즉 특정 데이터베이스 제품에만 통용되는 `고유 방언`이 생겨나게 되었다.
- 고유 방언의 간단한 사례로 `키워드 생략`을 들 수 있다.
- 데이터를 삭제할 때는 `DELETE` 명령어를 사용하는데, `Oracle`이나 `SQL Server`에서는 `DELETE` 뒤에 붙는 `FROM`을 생략해도 별 다른 문제가 없다. 그에 비해 `DB2`나 `PostgreSQL`, `MySQL`에서는 `FROM`을 생략할 경우 구문 에러가 발생해서 실행되지 않는다.
- 다른 대표적인 방언의 사례로 `외부결합`을 들 수 있다.
- `Oracle`에서는 `(+)`라는 특별한 연산자를 이용해 외부결합조건을 저장하는 데 비해, `SQL Server`에서는 `*=` 연산자를 이용한다.
- 이와 같은 방언들 없애기 위해 `ISO`나 `ANSI`가 결정한 `SQL-92`, `SQL-99`, `SQL-2003`등이 바로 `표준 SQL`이고, 여기서 숫자는 책정된 해를 나타낸다.
- 표준 SQL로 외부결합을 하는 방법은 `LEFT JOIN`이다.

##### SQL에는 방언이 있다! 방언 대신 표준 SQL을 사용하는 편이 좋다!

---