PostgreSQL에서 데이터베이스와 스키마
Intro
PostgreSQL의 데이터 구조 객체 중에는 “데이터베이스(Database)”와 “스키마(Schema)” 가 있다. 두 개념은 역할과 범위가 다르지만, 처음 접할 때에는 혼동하기 쉽다. 따라서 이번 포스팅에서는 두 개념에 대해 차이를 명확히 구분해보도록 한다.

(빨간 색 네모 부분이 데이터베이스, 초록색이 스키마)
데이터베이스와 스키마 요약
데이터베이스와 스키마를 각각 한 줄로 표현해보면 아래와 같다.
- “데이터베이스(Database)”는 논리적으로 완전히 분리된 저장 공간
- “스키마(Schema)”는 하나의 데이터베이스 내부에서 객체를 구분하는 네임스페이스
구조로 이해하기
1
2
3
4
5
6
7
8
9
10
PostgreSQL 서버
├── database1
│ ├── schema1
│ │ └──table
│ ├── schema2
│ │ └──table
│
├── database2
├── schema1
└──table
- 데이터베이스는 자신과 다른 데이터베이스와 논리적으로 완전히 분리된 저장공간이다.
- 스키마는 데이터베이스 하위에 존재하며 테이블과 같은 데이터베이스 하위 객체를 구분하는 네임스페이스 개념이다.
데이터베이스와 스키마
Database 데이터베이스
특징
- 데이터베이스 간 서로 논리적으로는 완전히 격리됨
- (물리적으로는 같은 서버 안에 존재할 수 있음)
- 한 DB에서 다른 DB의 테이블을 일반적인 방식으로는 직접 조회할 수 없음
- 다른 DB의 테이블을 조회하기 위해서는 접속을 바꿔야 함 (
\c db명) - 보통 서비스 단위로 데이터베이스를 나눔
예시
1
2
CREATE DATABASE shop;
CREATE DATABASE analysis;
👉 shop DB에서 analysis DB 테이블은 일반적인 방식으로는 바로 조회 불가
Schema
특징
- 하나의 데이터베이스 안에서 네임스페이스 (논리적인 구분자) 역할
- 테이블 등의 이름 충돌을 방지하는 역할을 함
- 스키마별로 권한을 분리할 수 있다. (스키마별 접근 통제 가능)
- 동일한 데이터베이스 안에서도 스키마가 다르다면 같은 테이블 이름을 사용할 수 있음
예시
- 스키마 생성
1
2
3
4
\c shop;
CREATE SCHEMA sales;
CREATE SCHEMA marketing;
- 테이블 생성
1
2
3
4
-- 스키마가 다르다면, 동일한 이름의 테이블 생성 가능
CREATE TABLE users ( ... ); -- public.users 테이블이 생성됨
CREATE TABLE sales.users ( ... ); -- sales.users 테이블이 생성됨
CREATE TABLE marketing.users ( ... ); -- marketing.users 테이블이 생성됨
👉 같은 DB 안에서도 같은 이름의 테이블 공존 가능
기본 스키마
- PostgreSQL은 데이터베이스를 만들면 기본적으로
public이라는 스키마를 가진다. - 조회 등에서 스키마를 지정하지 않으면
saerch_path설정값을 따른다. search_path의 기본값에는"$user",public이 포함된다."$user"란, 현재 로그인한 사용자 이름과 동일한 스키마를 뜻한다.- 즉, 스키마 지정이 없다면, search_path 에 있는 스키마에서 찾으며, search_path 의 기본값은 현재 유저의 이름과 동일한 스키마와 public 스키마이다.
- search_path 에 스키마 추가가 가능하다.
조회 방식의 차이
스키마 지정 없이 조회
1
SELECT * FROM users;
→ search_path 에 따라 스키마 지정이 결정되며, 기본값은 public 스키마이다.
1
2
3
-- 별도 지정이 없는 경우, 아래 두 쿼리는 같음
SELECT * FROM users;
SELECT * FROM public.users;
스키마를 지정하여 조회
1
SELECT * FROM sales.users;
→ sales 스키마의 users 테이블에서 조회
핵심 요약
- DB는 “논리적으로 완전히 분리된 다른 공간”
- Schema는 “같은 공간 안의 네임스페이스”
| 항목 | Database | Schema |
|---|---|---|
| 별도 접속 필요 | O | X |
| 논리적 완전 격리 | O | X |
| cross query | 불가 | 가능 |
| 권한 분리 | 가능 | 가능 |
언제 Database 와 Schema를 사용하나
(1) Database를 사용하는 경우
- 완전히 분리된 서비스에 대해서는 각각의 데이터베이스를 사용
- 다른 프로젝트는 각각의 데이터베이스를 사용
- 데이터의 격리가 필요할 경우
- 백업 단위를 분리하는 경우
- 데이터베이스별로 권한을 분리할 수 있음
(2) Schema를 사용하는 경우
- 같은 서비스 내부에서 다른 관심주제에 대해서 스키마를 사용
- 기능별로 분리하는 경우 (user, order, log 등)
- 스키마별로도 권한을 분리할 수 있음
Comments